@stigg/typescript-mcp 0.1.0-alpha.9 → 0.1.0-beta.1
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/code-tool-paths.cjs +8 -0
- package/code-tool-paths.cjs.map +1 -0
- package/code-tool-paths.d.cts +2 -0
- package/code-tool-paths.d.cts.map +1 -0
- package/code-tool-types.d.mts.map +1 -1
- package/code-tool-types.d.ts.map +1 -1
- package/code-tool-worker.d.mts +5 -0
- package/code-tool-worker.d.mts.map +1 -0
- package/code-tool-worker.d.ts +5 -0
- package/code-tool-worker.d.ts.map +1 -0
- package/code-tool-worker.js +357 -0
- package/code-tool-worker.js.map +1 -0
- package/code-tool-worker.mjs +319 -0
- package/code-tool-worker.mjs.map +1 -0
- package/code-tool.d.mts +8 -2
- package/code-tool.d.mts.map +1 -1
- package/code-tool.d.ts +8 -2
- package/code-tool.d.ts.map +1 -1
- package/code-tool.js +266 -37
- package/code-tool.js.map +1 -1
- package/code-tool.mjs +233 -37
- package/code-tool.mjs.map +1 -1
- package/docs-search-tool.d.mts +3 -1
- package/docs-search-tool.d.mts.map +1 -1
- package/docs-search-tool.d.ts +3 -1
- package/docs-search-tool.d.ts.map +1 -1
- package/docs-search-tool.js +53 -4
- package/docs-search-tool.js.map +1 -1
- package/docs-search-tool.mjs +52 -4
- package/docs-search-tool.mjs.map +1 -1
- package/http.d.mts +2 -4
- package/http.d.mts.map +1 -1
- package/http.d.ts +2 -4
- package/http.d.ts.map +1 -1
- package/http.js +123 -40
- package/http.js.map +1 -1
- package/http.mjs +123 -40
- package/http.mjs.map +1 -1
- package/index.js +13 -12
- package/index.js.map +1 -1
- package/index.mjs +13 -12
- package/index.mjs.map +1 -1
- package/instructions.d.mts +5 -0
- package/instructions.d.mts.map +1 -0
- package/instructions.d.ts +5 -0
- package/instructions.d.ts.map +1 -0
- package/instructions.js +61 -0
- package/instructions.js.map +1 -0
- package/instructions.mjs +55 -0
- package/instructions.mjs.map +1 -0
- 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 +4774 -0
- package/local-docs-search.js.map +1 -0
- package/local-docs-search.mjs +4734 -0
- package/local-docs-search.mjs.map +1 -0
- package/logger.d.mts +7 -0
- package/logger.d.mts.map +1 -0
- package/logger.d.ts +7 -0
- package/logger.d.ts.map +1 -0
- package/logger.js +29 -0
- package/logger.js.map +1 -0
- package/logger.mjs +22 -0
- package/logger.mjs.map +1 -0
- package/methods.d.mts.map +1 -1
- package/methods.d.ts.map +1 -1
- package/methods.js +235 -43
- package/methods.js.map +1 -1
- package/methods.mjs +235 -43
- package/methods.mjs.map +1 -1
- package/options.d.mts +7 -0
- package/options.d.mts.map +1 -1
- package/options.d.ts +7 -0
- package/options.d.ts.map +1 -1
- package/options.js +42 -0
- package/options.js.map +1 -1
- package/options.mjs +42 -0
- package/options.mjs.map +1 -1
- package/package.json +58 -7
- package/server.d.mts +10 -1
- package/server.d.mts.map +1 -1
- package/server.d.ts +10 -1
- package/server.d.ts.map +1 -1
- package/server.js +72 -47
- package/server.js.map +1 -1
- package/server.mjs +72 -47
- package/server.mjs.map +1 -1
- package/src/code-tool-paths.cts +5 -0
- package/src/code-tool-types.ts +1 -0
- package/src/code-tool-worker.ts +370 -0
- package/src/code-tool.ts +302 -47
- package/src/docs-search-tool.ts +81 -11
- package/src/http.ts +131 -42
- package/src/index.ts +15 -13
- package/src/instructions.ts +83 -0
- package/src/local-docs-search.ts +5667 -0
- package/src/logger.ts +28 -0
- package/src/methods.ts +235 -43
- package/src/options.ts +56 -0
- package/src/server.ts +85 -58
- package/src/stdio.ts +6 -2
- package/src/types.ts +3 -0
- package/src/util.ts +2 -2
- package/stdio.d.mts.map +1 -1
- package/stdio.d.ts.map +1 -1
- package/stdio.js +6 -2
- package/stdio.js.map +1 -1
- package/stdio.mjs +6 -2
- package/stdio.mjs.map +1 -1
- package/types.d.mts +6 -0
- package/types.d.mts.map +1 -1
- package/types.d.ts +6 -0
- package/types.d.ts.map +1 -1
- package/types.js.map +1 -1
- package/types.mjs.map +1 -1
- package/util.js +2 -2
- package/util.js.map +1 -1
- package/util.mjs +2 -2
- package/util.mjs.map +1 -1
package/options.mjs
CHANGED
|
@@ -19,8 +19,33 @@ export function parseCLIOptions() {
|
|
|
19
19
|
type: 'string',
|
|
20
20
|
array: true,
|
|
21
21
|
description: 'Methods to explicitly block for code tool. Evaluated as regular expressions against method fully qualified names. If all code-allow-* flags are unset, then everything is allowed.',
|
|
22
|
+
})
|
|
23
|
+
.option('code-execution-mode', {
|
|
24
|
+
type: 'string',
|
|
25
|
+
choices: ['stainless-sandbox', 'local'],
|
|
26
|
+
default: 'stainless-sandbox',
|
|
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',
|
|
22
32
|
})
|
|
23
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
|
+
})
|
|
44
|
+
.option('log-format', {
|
|
45
|
+
type: 'string',
|
|
46
|
+
choices: ['json', 'pretty'],
|
|
47
|
+
description: 'Format for log output; defaults to json unless tty is detected',
|
|
48
|
+
})
|
|
24
49
|
.option('no-tools', {
|
|
25
50
|
type: 'string',
|
|
26
51
|
array: true,
|
|
@@ -57,16 +82,26 @@ export function parseCLIOptions() {
|
|
|
57
82
|
const shouldIncludeToolType = (toolType) => argv.noTools?.includes(toolType) ? false
|
|
58
83
|
: argv.tools?.includes(toolType) ? true
|
|
59
84
|
: undefined;
|
|
85
|
+
const includeCodeTool = shouldIncludeToolType('code');
|
|
60
86
|
const includeDocsTools = shouldIncludeToolType('docs');
|
|
61
87
|
const transport = argv.transport;
|
|
88
|
+
const logFormat = argv.logFormat ? argv.logFormat
|
|
89
|
+
: process.stderr.isTTY ? 'pretty'
|
|
90
|
+
: 'json';
|
|
62
91
|
return {
|
|
92
|
+
...(includeCodeTool !== undefined && { includeCodeTool }),
|
|
63
93
|
...(includeDocsTools !== undefined && { includeDocsTools }),
|
|
64
94
|
debug: !!argv.debug,
|
|
65
95
|
stainlessApiKey: argv.stainlessApiKey,
|
|
96
|
+
docsSearchMode: argv.docsSearchMode,
|
|
97
|
+
docsDir: argv.docsDir,
|
|
66
98
|
codeAllowHttpGets: argv.codeAllowHttpGets,
|
|
67
99
|
codeAllowedMethods: argv.codeAllowedMethods,
|
|
68
100
|
codeBlockedMethods: argv.codeBlockedMethods,
|
|
101
|
+
codeExecutionMode: argv.codeExecutionMode,
|
|
102
|
+
customInstructionsPath: argv.customInstructionsPath,
|
|
69
103
|
transport,
|
|
104
|
+
logFormat,
|
|
70
105
|
port: argv.port,
|
|
71
106
|
socket: argv.socket,
|
|
72
107
|
};
|
|
@@ -82,11 +117,18 @@ const QueryOptions = z.object({
|
|
|
82
117
|
export function parseQueryOptions(defaultOptions, query) {
|
|
83
118
|
const queryObject = typeof query === 'string' ? qs.parse(query) : query;
|
|
84
119
|
const queryOptions = QueryOptions.parse(queryObject);
|
|
120
|
+
let codeTool = queryOptions.no_tools && queryOptions.no_tools?.includes('code') ? false
|
|
121
|
+
: queryOptions.tools?.includes('code') ? true
|
|
122
|
+
: defaultOptions.includeCodeTool;
|
|
85
123
|
let docsTools = queryOptions.no_tools && queryOptions.no_tools?.includes('docs') ? false
|
|
86
124
|
: queryOptions.tools?.includes('docs') ? true
|
|
87
125
|
: defaultOptions.includeDocsTools;
|
|
88
126
|
return {
|
|
127
|
+
...(codeTool !== undefined && { includeCodeTool: codeTool }),
|
|
89
128
|
...(docsTools !== undefined && { includeDocsTools: docsTools }),
|
|
129
|
+
codeExecutionMode: defaultOptions.codeExecutionMode,
|
|
130
|
+
docsSearchMode: defaultOptions.docsSearchMode,
|
|
131
|
+
docsDir: defaultOptions.docsDir,
|
|
90
132
|
};
|
|
91
133
|
}
|
|
92
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":"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;AAyBlB,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACtC,MAAM,CAAC,sBAAsB,EAAE;QAC9B,IAAI,EAAE,SAAS;QACf,WAAW,EACT,+HAA+H;KAClI,CAAC;SACD,MAAM,CAAC,sBAAsB,EAAE;QAC9B,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;QACX,WAAW,EACT,oLAAoL;KACvL,CAAC;SACD,MAAM,CAAC,sBAAsB,EAAE;QAC9B,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;QACX,WAAW,EACT,oLAAoL;KACvL,CAAC;SACD,MAAM,CAAC,qBAAqB,EAAE;QAC7B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC;QACvC,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EACT,oLAAoL;KACvL,CAAC;SACD,MAAM,CAAC,0BAA0B,EAAE;QAClC,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gDAAgD;KAC9D,CAAC;SACD,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;SACzE,MAAM,CAAC,UAAU,EAAE;QAClB,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,mGAAmG;KACtG,CAAC;SACD,MAAM,CAAC,kBAAkB,EAAE;QAC1B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC;QACnC,OAAO,EAAE,eAAe;QACxB,WAAW,EACT,uMAAuM;KAC1M,CAAC;SACD,MAAM,CAAC,YAAY,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC3B,WAAW,EAAE,gEAAgE;KAC9E,CAAC;SACD,MAAM,CAAC,UAAU,EAAE;QAClB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,6BAA6B;KAC3C,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,0CAA0C;KACxD,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;SACpG,MAAM,CAAC,mBAAmB,EAAE;QAC3B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC;QACrC,WAAW,EACT,2FAA2F;KAC9F,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,4BAA4B;KAC1C,CAAC;SACD,MAAM,CAAC,WAAW,EAAE;QACnB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QAC1B,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,2EAA2E;KACzF,CAAC;SACD,GAAG,CAAC,YAAY,CAAC;SACjB,OAAO,CAAC,IAAI,CAAC;SACb,IAAI,EAAE,CAAC;IAEV,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAE9B,MAAM,qBAAqB,GAAG,CAAC,QAAyB,EAAE,EAAE,CAC1D,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK;QACxC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;YACvC,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,eAAe,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG,IAAI,CAAC,SAA6B,CAAC;IACrD,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,IAAI,CAAC,SAA+B;QACtD,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;YACjC,CAAC,CAAC,MAAM,CAAC;IAEX,OAAO;QACL,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,EAAE,eAAe,EAAE,CAAC;QACzD,GAAG,CAAC,gBAAgB,KAAK,SAAS,IAAI,EAAE,gBAAgB,EAAE,CAAC;QAC3D,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK;QACnB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,cAAc,EAAE,IAAI,CAAC,cAAuD;QAC5E,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,iBAAiB,EAAE,IAAI,CAAC,iBAAyC;QACjE,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;QACnD,SAAS;QACT,SAAS;QACT,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,CAAyB,OAAU,EAAE,EAAE,CACzD,CAAC,CAAC,UAAU,CACV,CAAC,GAAG,EAAE,EAAE,CACN,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;IACxB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACb,CAAC,CAAC,GAAG,EACP,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAC5B,CAAC;AAEJ,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACvF,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC/F,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;CACrF,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,cAA0B,EAAE,KAAc;IAC1E,MAAM,WAAW,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAErD,IAAI,QAAQ,GACV,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QACxE,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YAC7C,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC;IAEnC,IAAI,SAAS,GACX,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QACxE,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YAC7C,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC;IAEpC,OAAO;QACL,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QAC5D,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC;QAC/D,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;QACnD,cAAc,EAAE,cAAc,CAAC,cAAc;QAC7C,OAAO,EAAE,cAAc,CAAC,OAAO;KAChC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stigg/typescript-mcp",
|
|
3
|
-
"version": "0.1.0-
|
|
3
|
+
"version": "0.1.0-beta.1",
|
|
4
4
|
"description": "The official MCP Server for the Stigg API",
|
|
5
5
|
"author": "Stigg <>",
|
|
6
6
|
"types": "./index.d.ts",
|
|
@@ -23,21 +23,26 @@
|
|
|
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
|
-
"@stigg/typescript": "^0.1.0-
|
|
30
|
+
"@stigg/typescript": "^0.1.0-beta.1",
|
|
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
|
-
"
|
|
40
|
-
"
|
|
43
|
+
"pino": "^10.3.1",
|
|
44
|
+
"pino-http": "^11.0.0",
|
|
45
|
+
"pino-pretty": "^13.1.3",
|
|
41
46
|
"qs": "^6.14.1",
|
|
42
47
|
"typescript": "5.8.3",
|
|
43
48
|
"yargs": "^17.7.2",
|
|
@@ -71,6 +76,12 @@
|
|
|
71
76
|
"./auth.mjs": {
|
|
72
77
|
"default": "./auth.mjs"
|
|
73
78
|
},
|
|
79
|
+
"./code-tool-paths": {
|
|
80
|
+
"require": "./code-tool-paths.cjs"
|
|
81
|
+
},
|
|
82
|
+
"./code-tool-paths.cjs": {
|
|
83
|
+
"default": "./code-tool-paths.cjs"
|
|
84
|
+
},
|
|
74
85
|
"./code-tool-types": {
|
|
75
86
|
"import": "./code-tool-types.mjs",
|
|
76
87
|
"require": "./code-tool-types.js"
|
|
@@ -81,6 +92,16 @@
|
|
|
81
92
|
"./code-tool-types.mjs": {
|
|
82
93
|
"default": "./code-tool-types.mjs"
|
|
83
94
|
},
|
|
95
|
+
"./code-tool-worker": {
|
|
96
|
+
"import": "./code-tool-worker.mjs",
|
|
97
|
+
"require": "./code-tool-worker.js"
|
|
98
|
+
},
|
|
99
|
+
"./code-tool-worker.js": {
|
|
100
|
+
"default": "./code-tool-worker.js"
|
|
101
|
+
},
|
|
102
|
+
"./code-tool-worker.mjs": {
|
|
103
|
+
"default": "./code-tool-worker.mjs"
|
|
104
|
+
},
|
|
84
105
|
"./code-tool": {
|
|
85
106
|
"import": "./code-tool.mjs",
|
|
86
107
|
"require": "./code-tool.js"
|
|
@@ -121,6 +142,36 @@
|
|
|
121
142
|
"./index.mjs": {
|
|
122
143
|
"default": "./index.mjs"
|
|
123
144
|
},
|
|
145
|
+
"./instructions": {
|
|
146
|
+
"import": "./instructions.mjs",
|
|
147
|
+
"require": "./instructions.js"
|
|
148
|
+
},
|
|
149
|
+
"./instructions.js": {
|
|
150
|
+
"default": "./instructions.js"
|
|
151
|
+
},
|
|
152
|
+
"./instructions.mjs": {
|
|
153
|
+
"default": "./instructions.mjs"
|
|
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
|
+
},
|
|
165
|
+
"./logger": {
|
|
166
|
+
"import": "./logger.mjs",
|
|
167
|
+
"require": "./logger.js"
|
|
168
|
+
},
|
|
169
|
+
"./logger.js": {
|
|
170
|
+
"default": "./logger.js"
|
|
171
|
+
},
|
|
172
|
+
"./logger.mjs": {
|
|
173
|
+
"default": "./logger.mjs"
|
|
174
|
+
},
|
|
124
175
|
"./methods": {
|
|
125
176
|
"import": "./methods.mjs",
|
|
126
177
|
"require": "./methods.js"
|
package/server.d.mts
CHANGED
|
@@ -3,7 +3,10 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
3
3
|
import { ClientOptions } from '@stigg/typescript';
|
|
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,12 @@ export declare function initMcpServer(params: {
|
|
|
13
16
|
clientOptions?: ClientOptions;
|
|
14
17
|
mcpOptions?: McpOptions;
|
|
15
18
|
stainlessApiKey?: string | undefined;
|
|
19
|
+
upstreamClientEnvs?: Record<string, string> | undefined;
|
|
20
|
+
mcpSessionId?: string | undefined;
|
|
21
|
+
mcpClientInfo?: {
|
|
22
|
+
name: string;
|
|
23
|
+
version: string;
|
|
24
|
+
} | undefined;
|
|
16
25
|
}): Promise<void>;
|
|
17
26
|
/**
|
|
18
27
|
* 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,mBAAmB;
|
|
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,mBAAmB;OAO1C,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;IACxD,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC/D,iBA0HA;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 '@stigg/typescript';
|
|
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,12 @@ export declare function initMcpServer(params: {
|
|
|
13
16
|
clientOptions?: ClientOptions;
|
|
14
17
|
mcpOptions?: McpOptions;
|
|
15
18
|
stainlessApiKey?: string | undefined;
|
|
19
|
+
upstreamClientEnvs?: Record<string, string> | undefined;
|
|
20
|
+
mcpSessionId?: string | undefined;
|
|
21
|
+
mcpClientInfo?: {
|
|
22
|
+
name: string;
|
|
23
|
+
version: string;
|
|
24
|
+
} | undefined;
|
|
16
25
|
}): Promise<void>;
|
|
17
26
|
/**
|
|
18
27
|
* 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,mBAAmB;
|
|
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,mBAAmB;OAO1C,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;IACxD,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC/D,iBA0HA;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,39 +13,15 @@ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
13
13
|
const typescript_1 = __importDefault(require("@stigg/typescript"));
|
|
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");
|
|
18
|
+
const instructions_1 = require("./instructions.js");
|
|
16
19
|
const methods_1 = require("./methods.js");
|
|
17
|
-
const
|
|
18
|
-
async function getInstructions(stainlessApiKey) {
|
|
19
|
-
// Setting the stainless API key is optional, but may be required
|
|
20
|
-
// to authenticate requests to the Stainless API.
|
|
21
|
-
const response = await fetch((0, util_1.readEnv)('CODE_MODE_INSTRUCTIONS_URL') ?? 'https://api.stainless.com/api/ai/instructions/stigg', {
|
|
22
|
-
method: 'GET',
|
|
23
|
-
headers: { ...(stainlessApiKey && { Authorization: stainlessApiKey }) },
|
|
24
|
-
});
|
|
25
|
-
let instructions;
|
|
26
|
-
if (!response.ok) {
|
|
27
|
-
console.warn('Warning: failed to retrieve MCP server instructions. Proceeding with default instructions...');
|
|
28
|
-
instructions = `
|
|
29
|
-
This is the stigg MCP server. You will use Code Mode to help the user perform
|
|
30
|
-
actions. You can use search_docs tool to learn about how to take action with this server. Then,
|
|
31
|
-
you will write TypeScript code using the execute tool take action. It is CRITICAL that you be
|
|
32
|
-
thoughtful and deliberate when executing code. Always try to entirely solve the problem in code
|
|
33
|
-
block: it can be as long as you need to get the job done!
|
|
34
|
-
`;
|
|
35
|
-
}
|
|
36
|
-
instructions ??= (await response.json()).instructions;
|
|
37
|
-
instructions = `
|
|
38
|
-
The current time in Unix timestamps is ${Date.now()}.
|
|
39
|
-
|
|
40
|
-
${instructions}
|
|
41
|
-
`;
|
|
42
|
-
return instructions;
|
|
43
|
-
}
|
|
44
|
-
const newMcpServer = async (stainlessApiKey) => new mcp_js_1.McpServer({
|
|
20
|
+
const newMcpServer = async ({ stainlessApiKey, customInstructionsPath, }) => new mcp_js_1.McpServer({
|
|
45
21
|
name: 'stigg_typescript_api',
|
|
46
|
-
version: '0.1.0-
|
|
22
|
+
version: '0.1.0-beta.1',
|
|
47
23
|
}, {
|
|
48
|
-
instructions: await getInstructions(stainlessApiKey),
|
|
24
|
+
instructions: await (0, instructions_1.getInstructions)({ stainlessApiKey, customInstructionsPath }),
|
|
49
25
|
capabilities: { tools: {}, logging: {} },
|
|
50
26
|
});
|
|
51
27
|
exports.newMcpServer = newMcpServer;
|
|
@@ -67,14 +43,38 @@ async function initMcpServer(params) {
|
|
|
67
43
|
warn: logAtLevel('warning'),
|
|
68
44
|
error: logAtLevel('error'),
|
|
69
45
|
};
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
+
}
|
|
51
|
+
let _client;
|
|
52
|
+
let _clientError;
|
|
53
|
+
let _logLevel;
|
|
54
|
+
const getClient = () => {
|
|
55
|
+
if (_clientError)
|
|
56
|
+
throw _clientError;
|
|
57
|
+
if (!_client) {
|
|
58
|
+
try {
|
|
59
|
+
_client = new typescript_1.default({
|
|
60
|
+
logger,
|
|
61
|
+
...params.clientOptions,
|
|
62
|
+
defaultHeaders: {
|
|
63
|
+
...params.clientOptions?.defaultHeaders,
|
|
64
|
+
'X-Stainless-MCP': 'true',
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
if (_logLevel) {
|
|
68
|
+
_client = _client.withOptions({ logLevel: _logLevel });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
_clientError = e instanceof Error ? e : new Error(String(e));
|
|
73
|
+
throw _clientError;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return _client;
|
|
77
|
+
};
|
|
78
78
|
const providedTools = selectTools(params.mcpOptions);
|
|
79
79
|
const toolMap = Object.fromEntries(providedTools.map((mcpTool) => [mcpTool.tool.name, mcpTool]));
|
|
80
80
|
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
@@ -88,35 +88,58 @@ async function initMcpServer(params) {
|
|
|
88
88
|
if (!mcpTool) {
|
|
89
89
|
throw new Error(`Unknown tool: ${name}`);
|
|
90
90
|
}
|
|
91
|
+
let client;
|
|
92
|
+
try {
|
|
93
|
+
client = getClient();
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
return {
|
|
97
|
+
content: [
|
|
98
|
+
{
|
|
99
|
+
type: 'text',
|
|
100
|
+
text: `Failed to initialize client: ${error instanceof Error ? error.message : String(error)}`,
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
isError: true,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
91
106
|
return executeHandler({
|
|
92
107
|
handler: mcpTool.handler,
|
|
93
108
|
reqContext: {
|
|
94
109
|
client,
|
|
95
110
|
stainlessApiKey: params.stainlessApiKey ?? params.mcpOptions?.stainlessApiKey,
|
|
111
|
+
upstreamClientEnvs: params.upstreamClientEnvs,
|
|
112
|
+
mcpSessionId: params.mcpSessionId,
|
|
113
|
+
mcpClientInfo: params.mcpClientInfo,
|
|
96
114
|
},
|
|
97
115
|
args,
|
|
98
116
|
});
|
|
99
117
|
});
|
|
100
118
|
server.setRequestHandler(types_js_1.SetLevelRequestSchema, async (request) => {
|
|
101
119
|
const { level } = request.params;
|
|
120
|
+
let logLevel;
|
|
102
121
|
switch (level) {
|
|
103
122
|
case 'debug':
|
|
104
|
-
|
|
123
|
+
logLevel = 'debug';
|
|
105
124
|
break;
|
|
106
125
|
case 'info':
|
|
107
|
-
|
|
126
|
+
logLevel = 'info';
|
|
108
127
|
break;
|
|
109
128
|
case 'notice':
|
|
110
129
|
case 'warning':
|
|
111
|
-
|
|
130
|
+
logLevel = 'warn';
|
|
112
131
|
break;
|
|
113
132
|
case 'error':
|
|
114
|
-
|
|
133
|
+
logLevel = 'error';
|
|
115
134
|
break;
|
|
116
135
|
default:
|
|
117
|
-
|
|
136
|
+
logLevel = 'off';
|
|
118
137
|
break;
|
|
119
138
|
}
|
|
139
|
+
_logLevel = logLevel;
|
|
140
|
+
if (_client) {
|
|
141
|
+
_client = _client.withOptions({ logLevel });
|
|
142
|
+
}
|
|
120
143
|
return {};
|
|
121
144
|
});
|
|
122
145
|
}
|
|
@@ -124,11 +147,13 @@ async function initMcpServer(params) {
|
|
|
124
147
|
* Selects the tools to include in the MCP Server based on the provided options.
|
|
125
148
|
*/
|
|
126
149
|
function selectTools(options) {
|
|
127
|
-
const includedTools = [
|
|
128
|
-
|
|
150
|
+
const includedTools = [];
|
|
151
|
+
if (options?.includeCodeTool ?? true) {
|
|
152
|
+
includedTools.push((0, code_tool_1.codeTool)({
|
|
129
153
|
blockedMethods: (0, methods_1.blockedMethodsForCodeTool)(options),
|
|
130
|
-
|
|
131
|
-
|
|
154
|
+
codeExecutionMode: options?.codeExecutionMode ?? 'stainless-sandbox',
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
132
157
|
if (options?.includeDocsTools ?? true) {
|
|
133
158
|
includedTools.push(docs_search_tool_1.default);
|
|
134
159
|
}
|
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,39 +4,15 @@ import { CallToolRequestSchema, ListToolsRequestSchema, SetLevelRequestSchema, }
|
|
|
4
4
|
import Stigg from '@stigg/typescript';
|
|
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";
|
|
9
|
+
import { getInstructions } from "./instructions.mjs";
|
|
7
10
|
import { blockedMethodsForCodeTool } from "./methods.mjs";
|
|
8
|
-
|
|
9
|
-
async function getInstructions(stainlessApiKey) {
|
|
10
|
-
// Setting the stainless API key is optional, but may be required
|
|
11
|
-
// to authenticate requests to the Stainless API.
|
|
12
|
-
const response = await fetch(readEnv('CODE_MODE_INSTRUCTIONS_URL') ?? 'https://api.stainless.com/api/ai/instructions/stigg', {
|
|
13
|
-
method: 'GET',
|
|
14
|
-
headers: { ...(stainlessApiKey && { Authorization: stainlessApiKey }) },
|
|
15
|
-
});
|
|
16
|
-
let instructions;
|
|
17
|
-
if (!response.ok) {
|
|
18
|
-
console.warn('Warning: failed to retrieve MCP server instructions. Proceeding with default instructions...');
|
|
19
|
-
instructions = `
|
|
20
|
-
This is the stigg MCP server. You will use Code Mode to help the user perform
|
|
21
|
-
actions. You can use search_docs tool to learn about how to take action with this server. Then,
|
|
22
|
-
you will write TypeScript code using the execute tool take action. It is CRITICAL that you be
|
|
23
|
-
thoughtful and deliberate when executing code. Always try to entirely solve the problem in code
|
|
24
|
-
block: it can be as long as you need to get the job done!
|
|
25
|
-
`;
|
|
26
|
-
}
|
|
27
|
-
instructions ??= (await response.json()).instructions;
|
|
28
|
-
instructions = `
|
|
29
|
-
The current time in Unix timestamps is ${Date.now()}.
|
|
30
|
-
|
|
31
|
-
${instructions}
|
|
32
|
-
`;
|
|
33
|
-
return instructions;
|
|
34
|
-
}
|
|
35
|
-
export const newMcpServer = async (stainlessApiKey) => new McpServer({
|
|
11
|
+
export const newMcpServer = async ({ stainlessApiKey, customInstructionsPath, }) => new McpServer({
|
|
36
12
|
name: 'stigg_typescript_api',
|
|
37
|
-
version: '0.1.0-
|
|
13
|
+
version: '0.1.0-beta.1',
|
|
38
14
|
}, {
|
|
39
|
-
instructions: await getInstructions(stainlessApiKey),
|
|
15
|
+
instructions: await getInstructions({ stainlessApiKey, customInstructionsPath }),
|
|
40
16
|
capabilities: { tools: {}, logging: {} },
|
|
41
17
|
});
|
|
42
18
|
/**
|
|
@@ -57,14 +33,38 @@ export async function initMcpServer(params) {
|
|
|
57
33
|
warn: logAtLevel('warning'),
|
|
58
34
|
error: logAtLevel('error'),
|
|
59
35
|
};
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
+
}
|
|
41
|
+
let _client;
|
|
42
|
+
let _clientError;
|
|
43
|
+
let _logLevel;
|
|
44
|
+
const getClient = () => {
|
|
45
|
+
if (_clientError)
|
|
46
|
+
throw _clientError;
|
|
47
|
+
if (!_client) {
|
|
48
|
+
try {
|
|
49
|
+
_client = new Stigg({
|
|
50
|
+
logger,
|
|
51
|
+
...params.clientOptions,
|
|
52
|
+
defaultHeaders: {
|
|
53
|
+
...params.clientOptions?.defaultHeaders,
|
|
54
|
+
'X-Stainless-MCP': 'true',
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
if (_logLevel) {
|
|
58
|
+
_client = _client.withOptions({ logLevel: _logLevel });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
_clientError = e instanceof Error ? e : new Error(String(e));
|
|
63
|
+
throw _clientError;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return _client;
|
|
67
|
+
};
|
|
68
68
|
const providedTools = selectTools(params.mcpOptions);
|
|
69
69
|
const toolMap = Object.fromEntries(providedTools.map((mcpTool) => [mcpTool.tool.name, mcpTool]));
|
|
70
70
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
@@ -78,35 +78,58 @@ export async function initMcpServer(params) {
|
|
|
78
78
|
if (!mcpTool) {
|
|
79
79
|
throw new Error(`Unknown tool: ${name}`);
|
|
80
80
|
}
|
|
81
|
+
let client;
|
|
82
|
+
try {
|
|
83
|
+
client = getClient();
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return {
|
|
87
|
+
content: [
|
|
88
|
+
{
|
|
89
|
+
type: 'text',
|
|
90
|
+
text: `Failed to initialize client: ${error instanceof Error ? error.message : String(error)}`,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
isError: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
81
96
|
return executeHandler({
|
|
82
97
|
handler: mcpTool.handler,
|
|
83
98
|
reqContext: {
|
|
84
99
|
client,
|
|
85
100
|
stainlessApiKey: params.stainlessApiKey ?? params.mcpOptions?.stainlessApiKey,
|
|
101
|
+
upstreamClientEnvs: params.upstreamClientEnvs,
|
|
102
|
+
mcpSessionId: params.mcpSessionId,
|
|
103
|
+
mcpClientInfo: params.mcpClientInfo,
|
|
86
104
|
},
|
|
87
105
|
args,
|
|
88
106
|
});
|
|
89
107
|
});
|
|
90
108
|
server.setRequestHandler(SetLevelRequestSchema, async (request) => {
|
|
91
109
|
const { level } = request.params;
|
|
110
|
+
let logLevel;
|
|
92
111
|
switch (level) {
|
|
93
112
|
case 'debug':
|
|
94
|
-
|
|
113
|
+
logLevel = 'debug';
|
|
95
114
|
break;
|
|
96
115
|
case 'info':
|
|
97
|
-
|
|
116
|
+
logLevel = 'info';
|
|
98
117
|
break;
|
|
99
118
|
case 'notice':
|
|
100
119
|
case 'warning':
|
|
101
|
-
|
|
120
|
+
logLevel = 'warn';
|
|
102
121
|
break;
|
|
103
122
|
case 'error':
|
|
104
|
-
|
|
123
|
+
logLevel = 'error';
|
|
105
124
|
break;
|
|
106
125
|
default:
|
|
107
|
-
|
|
126
|
+
logLevel = 'off';
|
|
108
127
|
break;
|
|
109
128
|
}
|
|
129
|
+
_logLevel = logLevel;
|
|
130
|
+
if (_client) {
|
|
131
|
+
_client = _client.withOptions({ logLevel });
|
|
132
|
+
}
|
|
110
133
|
return {};
|
|
111
134
|
});
|
|
112
135
|
}
|
|
@@ -114,11 +137,13 @@ export async function initMcpServer(params) {
|
|
|
114
137
|
* Selects the tools to include in the MCP Server based on the provided options.
|
|
115
138
|
*/
|
|
116
139
|
export function selectTools(options) {
|
|
117
|
-
const includedTools = [
|
|
118
|
-
|
|
140
|
+
const includedTools = [];
|
|
141
|
+
if (options?.includeCodeTool ?? true) {
|
|
142
|
+
includedTools.push(codeTool({
|
|
119
143
|
blockedMethods: blockedMethodsForCodeTool(options),
|
|
120
|
-
|
|
121
|
-
|
|
144
|
+
codeExecutionMode: options?.codeExecutionMode ?? 'stainless-sandbox',
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
122
147
|
if (options?.includeDocsTools ?? true) {
|
|
123
148
|
includedTools.push(docsSearchTool);
|
|
124
149
|
}
|