@outfitter/mcp 0.4.2 → 0.4.3
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 +38 -28
- package/dist/actions.d.ts +2 -2
- package/dist/actions.js +25 -4
- package/dist/core-tools.d.ts +2 -2
- package/dist/core-tools.js +140 -6
- package/dist/index.d.ts +7 -952
- package/dist/index.js +7 -959
- package/dist/schema.js +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/dist/shared/@outfitter/{mcp-s3gfhcdk.d.ts → mcp-7kcw2814.d.ts} +1 -1
- package/dist/shared/@outfitter/{mcp-hh12tqfg.js → mcp-b502y16n.js} +3 -3
- package/dist/shared/@outfitter/{mcp-5jcgb033.d.ts → mcp-d8vs6vry.d.ts} +1 -1
- package/dist/shared/@outfitter/{mcp-fks4zt1z.d.ts → mcp-gqjg15f5.d.ts} +5 -35
- package/dist/shared/@outfitter/mcp-hw5wz4gb.js +1 -0
- package/dist/shared/@outfitter/{mcp-5b5726ga.d.ts → mcp-knq080yt.d.ts} +1 -1
- package/dist/shared/@outfitter/{mcp-zb3p61y9.d.ts → mcp-s6afm4ff.d.ts} +1 -1
- package/dist/transport.d.ts +2 -2
- package/dist/transport.js +161 -5
- package/dist/types.d.ts +1 -1
- package/package.json +29 -29
- package/dist/shared/@outfitter/mcp-mzky3ck8.js +0 -165
- package/dist/shared/@outfitter/mcp-zmc7ht6z.js +0 -28
- package/dist/shared/@outfitter/mcp-zv3ej45k.js +0 -143
- package/dist/shared/@outfitter/mcp-zy7b487d.js +0 -5
package/dist/schema.js
CHANGED
package/dist/server.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createMcpServer, definePrompt, defineResource, defineResourceTemplate, defineTool } from "./shared/@outfitter/mcp-
|
|
2
|
-
import "./shared/@outfitter/mcp-
|
|
1
|
+
import { createMcpServer, definePrompt, defineResource, defineResourceTemplate, defineTool } from "./shared/@outfitter/mcp-knq080yt.js";
|
|
2
|
+
import "./shared/@outfitter/mcp-gqjg15f5.js";
|
|
3
3
|
import "./shared/@outfitter/mcp-cqpyer9m.js";
|
|
4
4
|
export { defineTool, defineResourceTemplate, defineResource, definePrompt, createMcpServer };
|
package/dist/server.js
CHANGED
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
defineResource,
|
|
6
6
|
defineResourceTemplate,
|
|
7
7
|
defineTool
|
|
8
|
-
} from "./shared/@outfitter/mcp-
|
|
8
|
+
} from "./shared/@outfitter/mcp-b502y16n.js";
|
|
9
9
|
import"./shared/@outfitter/mcp-fjtxsa0x.js";
|
|
10
|
-
import"./shared/@outfitter/mcp-zy7b487d.js";
|
|
11
10
|
import"./shared/@outfitter/mcp-9m5hs2z0.js";
|
|
11
|
+
import"./shared/@outfitter/mcp-hw5wz4gb.js";
|
|
12
12
|
export {
|
|
13
13
|
defineTool,
|
|
14
14
|
defineResourceTemplate,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { McpServer } from "./mcp-
|
|
1
|
+
import { McpServer } from "./mcp-gqjg15f5.js";
|
|
2
2
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
4
|
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
shouldEmitLog
|
|
4
4
|
} from "./mcp-fjtxsa0x.js";
|
|
5
|
-
import {
|
|
6
|
-
zodToJsonSchema
|
|
7
|
-
} from "./mcp-zy7b487d.js";
|
|
8
5
|
import {
|
|
9
6
|
McpError
|
|
10
7
|
} from "./mcp-9m5hs2z0.js";
|
|
8
|
+
import {
|
|
9
|
+
zodToJsonSchema
|
|
10
|
+
} from "./mcp-hw5wz4gb.js";
|
|
11
11
|
|
|
12
12
|
// packages/mcp/src/server.ts
|
|
13
13
|
import { getEnvironment, getEnvironmentDefaults } from "@outfitter/config";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ToolDefinition } from "./mcp-
|
|
1
|
+
import { ToolDefinition } from "./mcp-gqjg15f5.js";
|
|
2
2
|
import { ActionRegistry, ActionSurface, AnyActionSpec } from "@outfitter/contracts";
|
|
3
3
|
interface BuildMcpToolsOptions {
|
|
4
4
|
readonly includeSurfaces?: readonly ActionSurface[];
|
|
@@ -80,41 +80,11 @@ interface ToolAnnotations {
|
|
|
80
80
|
* limitation; presets + spread cover most edge cases.
|
|
81
81
|
*/
|
|
82
82
|
declare const TOOL_ANNOTATIONS: {
|
|
83
|
-
|
|
84
|
-
readonly
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
readonly openWorldHint: false;
|
|
89
|
-
};
|
|
90
|
-
/** Creates or updates state, not destructive. */
|
|
91
|
-
readonly write: {
|
|
92
|
-
readonly readOnlyHint: false;
|
|
93
|
-
readonly destructiveHint: false;
|
|
94
|
-
readonly idempotentHint: false;
|
|
95
|
-
readonly openWorldHint: false;
|
|
96
|
-
};
|
|
97
|
-
/** Idempotent write (PUT-like). */
|
|
98
|
-
readonly writeIdempotent: {
|
|
99
|
-
readonly readOnlyHint: false;
|
|
100
|
-
readonly destructiveHint: false;
|
|
101
|
-
readonly idempotentHint: true;
|
|
102
|
-
readonly openWorldHint: false;
|
|
103
|
-
};
|
|
104
|
-
/** Deletes or permanently modifies data. */
|
|
105
|
-
readonly destructive: {
|
|
106
|
-
readonly readOnlyHint: false;
|
|
107
|
-
readonly destructiveHint: true;
|
|
108
|
-
readonly idempotentHint: true;
|
|
109
|
-
readonly openWorldHint: false;
|
|
110
|
-
};
|
|
111
|
-
/** Interacts with external systems (APIs, network). */
|
|
112
|
-
readonly openWorld: {
|
|
113
|
-
readonly readOnlyHint: false;
|
|
114
|
-
readonly destructiveHint: false;
|
|
115
|
-
readonly idempotentHint: false;
|
|
116
|
-
readonly openWorldHint: true;
|
|
117
|
-
};
|
|
83
|
+
readonly destructive: ToolAnnotations;
|
|
84
|
+
readonly openWorld: ToolAnnotations;
|
|
85
|
+
readonly readOnly: ToolAnnotations;
|
|
86
|
+
readonly write: ToolAnnotations;
|
|
87
|
+
readonly writeIdempotent: ToolAnnotations;
|
|
118
88
|
};
|
|
119
89
|
/**
|
|
120
90
|
* Definition of an MCP tool that can be invoked by clients.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { zodToJsonSchema } from "@outfitter/contracts/schema";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { McpServer, McpServerOptions, PromptDefinition, ResourceDefinition, ResourceTemplateDefinition, ToolDefinition } from "./mcp-
|
|
1
|
+
import { McpServer, McpServerOptions, PromptDefinition, ResourceDefinition, ResourceTemplateDefinition, ToolDefinition } from "./mcp-gqjg15f5.js";
|
|
2
2
|
import { OutfitterError } from "@outfitter/contracts";
|
|
3
3
|
/**
|
|
4
4
|
* Create an MCP server instance.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ToolDefinition } from "./mcp-
|
|
1
|
+
import { ToolDefinition } from "./mcp-gqjg15f5.js";
|
|
2
2
|
import { HandlerContext, OutfitterError } from "@outfitter/contracts";
|
|
3
3
|
import { Result } from "@outfitter/contracts";
|
|
4
4
|
type DocsSection = "overview" | "tools" | "examples" | "schemas";
|
package/dist/transport.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { McpToolResponse, connectStdio, createSdkServer, wrapToolError, wrapToolResult } from "./shared/@outfitter/mcp-
|
|
2
|
-
import "./shared/@outfitter/mcp-
|
|
1
|
+
import { McpToolResponse, connectStdio, createSdkServer, wrapToolError, wrapToolResult } from "./shared/@outfitter/mcp-7kcw2814.js";
|
|
2
|
+
import "./shared/@outfitter/mcp-gqjg15f5.js";
|
|
3
3
|
import "./shared/@outfitter/mcp-cqpyer9m.js";
|
|
4
4
|
export { wrapToolResult, wrapToolError, createSdkServer, connectStdio, McpToolResponse };
|
package/dist/transport.js
CHANGED
|
@@ -1,10 +1,166 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
// packages/mcp/src/transport.ts
|
|
3
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
2
5
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
CallToolRequestSchema,
|
|
7
|
+
CompleteRequestSchema,
|
|
8
|
+
GetPromptRequestSchema,
|
|
9
|
+
ListPromptsRequestSchema,
|
|
10
|
+
ListResourcesRequestSchema,
|
|
11
|
+
ListResourceTemplatesRequestSchema,
|
|
12
|
+
ListToolsRequestSchema,
|
|
13
|
+
ReadResourceRequestSchema,
|
|
14
|
+
McpError as SdkMcpError,
|
|
15
|
+
SetLevelRequestSchema,
|
|
16
|
+
SubscribeRequestSchema,
|
|
17
|
+
UnsubscribeRequestSchema
|
|
18
|
+
} from "@modelcontextprotocol/sdk/types.js";
|
|
19
|
+
import { safeStringify } from "@outfitter/contracts";
|
|
20
|
+
function isMcpToolResponse(value) {
|
|
21
|
+
if (!value || typeof value !== "object") {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const content = value.content;
|
|
25
|
+
return Array.isArray(content);
|
|
26
|
+
}
|
|
27
|
+
function toTextPayload(value) {
|
|
28
|
+
if (typeof value === "string") {
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
return safeStringify(value);
|
|
32
|
+
}
|
|
33
|
+
function serializeError(error) {
|
|
34
|
+
if (error && typeof error === "object") {
|
|
35
|
+
const record = error;
|
|
36
|
+
return {
|
|
37
|
+
_tag: record._tag ?? "McpError",
|
|
38
|
+
message: record.message ?? "Unknown error",
|
|
39
|
+
code: record.code,
|
|
40
|
+
context: record.context
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
_tag: "McpError",
|
|
45
|
+
message: String(error)
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function wrapToolResult(value) {
|
|
49
|
+
if (isMcpToolResponse(value)) {
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
const structuredContent = value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{
|
|
56
|
+
type: "text",
|
|
57
|
+
text: toTextPayload(value)
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
...structuredContent ? { structuredContent } : {}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function wrapToolError(error) {
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: "text",
|
|
68
|
+
text: toTextPayload(serializeError(error))
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
isError: true
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function toSdkError(error) {
|
|
75
|
+
return new SdkMcpError(error.code, error.message, error.context);
|
|
76
|
+
}
|
|
77
|
+
function createSdkServer(server) {
|
|
78
|
+
const capabilities = {
|
|
79
|
+
tools: { listChanged: true },
|
|
80
|
+
resources: { listChanged: true, subscribe: true },
|
|
81
|
+
prompts: { listChanged: true },
|
|
82
|
+
completions: {},
|
|
83
|
+
logging: {}
|
|
84
|
+
};
|
|
85
|
+
const sdkServer = new Server({ name: server.name, version: server.version }, { capabilities });
|
|
86
|
+
sdkServer.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
87
|
+
tools: server.getTools()
|
|
88
|
+
}));
|
|
89
|
+
sdkServer.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
90
|
+
const { name, arguments: args } = request.params;
|
|
91
|
+
const progressToken = request.params._meta?.progressToken;
|
|
92
|
+
const options = progressToken !== undefined ? { progressToken } : undefined;
|
|
93
|
+
const result = await server.invokeTool(name, args ?? {}, options);
|
|
94
|
+
if (result.isErr()) {
|
|
95
|
+
return wrapToolError(result.error);
|
|
96
|
+
}
|
|
97
|
+
return wrapToolResult(result.value);
|
|
98
|
+
});
|
|
99
|
+
sdkServer.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
100
|
+
resources: server.getResources().map((r) => ({
|
|
101
|
+
uri: r.uri,
|
|
102
|
+
name: r.name,
|
|
103
|
+
...r.description ? { description: r.description } : {},
|
|
104
|
+
...r.mimeType ? { mimeType: r.mimeType } : {}
|
|
105
|
+
}))
|
|
106
|
+
}));
|
|
107
|
+
sdkServer.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({
|
|
108
|
+
resourceTemplates: server.getResourceTemplates().map((t) => ({
|
|
109
|
+
uriTemplate: t.uriTemplate,
|
|
110
|
+
name: t.name,
|
|
111
|
+
...t.description ? { description: t.description } : {},
|
|
112
|
+
...t.mimeType ? { mimeType: t.mimeType } : {}
|
|
113
|
+
}))
|
|
114
|
+
}));
|
|
115
|
+
sdkServer.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
116
|
+
const { uri } = request.params;
|
|
117
|
+
const result = await server.readResource(uri);
|
|
118
|
+
if (result.isErr()) {
|
|
119
|
+
throw toSdkError(result.error);
|
|
120
|
+
}
|
|
121
|
+
return { contents: result.value };
|
|
122
|
+
});
|
|
123
|
+
sdkServer.setRequestHandler(SubscribeRequestSchema, async (request) => {
|
|
124
|
+
server.subscribe(request.params.uri);
|
|
125
|
+
return {};
|
|
126
|
+
});
|
|
127
|
+
sdkServer.setRequestHandler(UnsubscribeRequestSchema, async (request) => {
|
|
128
|
+
server.unsubscribe(request.params.uri);
|
|
129
|
+
return {};
|
|
130
|
+
});
|
|
131
|
+
sdkServer.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
132
|
+
prompts: server.getPrompts()
|
|
133
|
+
}));
|
|
134
|
+
sdkServer.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
135
|
+
const { name, arguments: args } = request.params;
|
|
136
|
+
const result = await server.getPrompt(name, args ?? {});
|
|
137
|
+
if (result.isErr()) {
|
|
138
|
+
throw toSdkError(result.error);
|
|
139
|
+
}
|
|
140
|
+
return { ...result.value };
|
|
141
|
+
});
|
|
142
|
+
sdkServer.setRequestHandler(CompleteRequestSchema, async (request) => {
|
|
143
|
+
const { ref, argument } = request.params;
|
|
144
|
+
const completionRef = ref.type === "ref/prompt" ? { type: "ref/prompt", name: ref.name } : { type: "ref/resource", uri: ref.uri };
|
|
145
|
+
const result = await server.complete(completionRef, argument.name, argument.value);
|
|
146
|
+
if (result.isErr()) {
|
|
147
|
+
throw toSdkError(result.error);
|
|
148
|
+
}
|
|
149
|
+
return { completion: result.value };
|
|
150
|
+
});
|
|
151
|
+
sdkServer.setRequestHandler(SetLevelRequestSchema, async (request) => {
|
|
152
|
+
const level = request.params.level;
|
|
153
|
+
server.setLogLevel?.(level);
|
|
154
|
+
return {};
|
|
155
|
+
});
|
|
156
|
+
server.bindSdkServer?.(sdkServer);
|
|
157
|
+
return sdkServer;
|
|
158
|
+
}
|
|
159
|
+
async function connectStdio(server, transport = new StdioServerTransport) {
|
|
160
|
+
const sdkServer = createSdkServer(server);
|
|
161
|
+
await sdkServer.connect(transport);
|
|
162
|
+
return sdkServer;
|
|
163
|
+
}
|
|
8
164
|
export {
|
|
9
165
|
wrapToolResult,
|
|
10
166
|
wrapToolError,
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { BlobResourceContent, CompletionHandler, CompletionRef, CompletionResult, ContentAnnotations, InvokeToolOptions, McpError, McpHandlerContext, McpServer, McpServerOptions, ProgressReporter, PromptArgument, PromptDefinition, PromptHandler, PromptMessage, PromptMessageContent, PromptResult, ResourceContent, ResourceDefinition, ResourceReadHandler, ResourceTemplateDefinition, ResourceTemplateReadHandler, Result, SerializedTool, TOOL_ANNOTATIONS, TaggedError, TextResourceContent, ToolAnnotations, ToolDefinition, adaptHandler } from "./shared/@outfitter/mcp-
|
|
1
|
+
import { BlobResourceContent, CompletionHandler, CompletionRef, CompletionResult, ContentAnnotations, InvokeToolOptions, McpError, McpHandlerContext, McpServer, McpServerOptions, ProgressReporter, PromptArgument, PromptDefinition, PromptHandler, PromptMessage, PromptMessageContent, PromptResult, ResourceContent, ResourceDefinition, ResourceReadHandler, ResourceTemplateDefinition, ResourceTemplateReadHandler, Result, SerializedTool, TOOL_ANNOTATIONS, TaggedError, TextResourceContent, ToolAnnotations, ToolDefinition, adaptHandler } from "./shared/@outfitter/mcp-gqjg15f5.js";
|
|
2
2
|
import "./shared/@outfitter/mcp-cqpyer9m.js";
|
|
3
3
|
export { adaptHandler, ToolDefinition, ToolAnnotations, TextResourceContent, TaggedError, TOOL_ANNOTATIONS, SerializedTool, Result, ResourceTemplateReadHandler, ResourceTemplateDefinition, ResourceReadHandler, ResourceDefinition, ResourceContent, PromptResult, PromptMessageContent, PromptMessage, PromptHandler, PromptDefinition, PromptArgument, ProgressReporter, McpServerOptions, McpServer, McpHandlerContext, McpError, InvokeToolOptions, ContentAnnotations, CompletionResult, CompletionRef, CompletionHandler, BlobResourceContent };
|
package/package.json
CHANGED
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@outfitter/mcp",
|
|
3
|
+
"version": "0.4.3",
|
|
3
4
|
"description": "MCP server framework with typed tools for Outfitter",
|
|
4
|
-
"
|
|
5
|
-
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"model-context-protocol",
|
|
8
|
+
"outfitter",
|
|
9
|
+
"tools",
|
|
10
|
+
"typescript"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/outfitter-dev/outfitter.git",
|
|
16
|
+
"directory": "packages/mcp"
|
|
17
|
+
},
|
|
6
18
|
"files": [
|
|
7
19
|
"dist"
|
|
8
20
|
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"sideEffects": false,
|
|
9
23
|
"module": "./dist/index.js",
|
|
10
24
|
"types": "./dist/index.d.ts",
|
|
11
25
|
"exports": {
|
|
@@ -59,11 +73,13 @@
|
|
|
59
73
|
}
|
|
60
74
|
}
|
|
61
75
|
},
|
|
62
|
-
"
|
|
76
|
+
"publishConfig": {
|
|
77
|
+
"access": "public"
|
|
78
|
+
},
|
|
63
79
|
"scripts": {
|
|
64
|
-
"build": "bunup --filter @outfitter/mcp",
|
|
65
|
-
"lint": "
|
|
66
|
-
"lint:fix": "
|
|
80
|
+
"build": "cd ../.. && bunup --filter @outfitter/mcp",
|
|
81
|
+
"lint": "oxlint ./src",
|
|
82
|
+
"lint:fix": "oxlint --fix ./src",
|
|
67
83
|
"test": "bun test",
|
|
68
84
|
"typecheck": "tsc --noEmit",
|
|
69
85
|
"clean": "rm -rf dist",
|
|
@@ -73,32 +89,16 @@
|
|
|
73
89
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
74
90
|
"zod": "^4.3.5"
|
|
75
91
|
},
|
|
92
|
+
"devDependencies": {
|
|
93
|
+
"@outfitter/config": "0.3.4",
|
|
94
|
+
"@outfitter/contracts": "0.4.2",
|
|
95
|
+
"@outfitter/logging": "0.4.2",
|
|
96
|
+
"@types/bun": "^1.3.9",
|
|
97
|
+
"typescript": "^5.9.3"
|
|
98
|
+
},
|
|
76
99
|
"peerDependencies": {
|
|
77
100
|
"@outfitter/config": ">=0.3.0",
|
|
78
101
|
"@outfitter/contracts": ">=0.2.0",
|
|
79
102
|
"@outfitter/logging": ">=0.3.0"
|
|
80
|
-
},
|
|
81
|
-
"devDependencies": {
|
|
82
|
-
"@outfitter/config": "0.3.3",
|
|
83
|
-
"@outfitter/contracts": "0.4.1",
|
|
84
|
-
"@outfitter/logging": "0.4.1",
|
|
85
|
-
"@types/bun": "latest",
|
|
86
|
-
"typescript": "^5.8.0"
|
|
87
|
-
},
|
|
88
|
-
"keywords": [
|
|
89
|
-
"outfitter",
|
|
90
|
-
"mcp",
|
|
91
|
-
"model-context-protocol",
|
|
92
|
-
"tools",
|
|
93
|
-
"typescript"
|
|
94
|
-
],
|
|
95
|
-
"license": "MIT",
|
|
96
|
-
"repository": {
|
|
97
|
-
"type": "git",
|
|
98
|
-
"url": "https://github.com/outfitter-dev/outfitter.git",
|
|
99
|
-
"directory": "packages/mcp"
|
|
100
|
-
},
|
|
101
|
-
"publishConfig": {
|
|
102
|
-
"access": "public"
|
|
103
103
|
}
|
|
104
104
|
}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
// packages/mcp/src/transport.ts
|
|
3
|
-
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
-
import {
|
|
6
|
-
CallToolRequestSchema,
|
|
7
|
-
CompleteRequestSchema,
|
|
8
|
-
GetPromptRequestSchema,
|
|
9
|
-
ListPromptsRequestSchema,
|
|
10
|
-
ListResourcesRequestSchema,
|
|
11
|
-
ListResourceTemplatesRequestSchema,
|
|
12
|
-
ListToolsRequestSchema,
|
|
13
|
-
ReadResourceRequestSchema,
|
|
14
|
-
McpError as SdkMcpError,
|
|
15
|
-
SetLevelRequestSchema,
|
|
16
|
-
SubscribeRequestSchema,
|
|
17
|
-
UnsubscribeRequestSchema
|
|
18
|
-
} from "@modelcontextprotocol/sdk/types.js";
|
|
19
|
-
import { safeStringify } from "@outfitter/contracts";
|
|
20
|
-
function isMcpToolResponse(value) {
|
|
21
|
-
if (!value || typeof value !== "object") {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
const content = value.content;
|
|
25
|
-
return Array.isArray(content);
|
|
26
|
-
}
|
|
27
|
-
function toTextPayload(value) {
|
|
28
|
-
if (typeof value === "string") {
|
|
29
|
-
return value;
|
|
30
|
-
}
|
|
31
|
-
return safeStringify(value);
|
|
32
|
-
}
|
|
33
|
-
function serializeError(error) {
|
|
34
|
-
if (error && typeof error === "object") {
|
|
35
|
-
const record = error;
|
|
36
|
-
return {
|
|
37
|
-
_tag: record._tag ?? "McpError",
|
|
38
|
-
message: record.message ?? "Unknown error",
|
|
39
|
-
code: record.code,
|
|
40
|
-
context: record.context
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
return {
|
|
44
|
-
_tag: "McpError",
|
|
45
|
-
message: String(error)
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
function wrapToolResult(value) {
|
|
49
|
-
if (isMcpToolResponse(value)) {
|
|
50
|
-
return value;
|
|
51
|
-
}
|
|
52
|
-
const structuredContent = value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
53
|
-
return {
|
|
54
|
-
content: [
|
|
55
|
-
{
|
|
56
|
-
type: "text",
|
|
57
|
-
text: toTextPayload(value)
|
|
58
|
-
}
|
|
59
|
-
],
|
|
60
|
-
...structuredContent ? { structuredContent } : {}
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
function wrapToolError(error) {
|
|
64
|
-
return {
|
|
65
|
-
content: [
|
|
66
|
-
{
|
|
67
|
-
type: "text",
|
|
68
|
-
text: toTextPayload(serializeError(error))
|
|
69
|
-
}
|
|
70
|
-
],
|
|
71
|
-
isError: true
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
function toSdkError(error) {
|
|
75
|
-
return new SdkMcpError(error.code, error.message, error.context);
|
|
76
|
-
}
|
|
77
|
-
function createSdkServer(server) {
|
|
78
|
-
const capabilities = {
|
|
79
|
-
tools: { listChanged: true },
|
|
80
|
-
resources: { listChanged: true, subscribe: true },
|
|
81
|
-
prompts: { listChanged: true },
|
|
82
|
-
completions: {},
|
|
83
|
-
logging: {}
|
|
84
|
-
};
|
|
85
|
-
const sdkServer = new Server({ name: server.name, version: server.version }, { capabilities });
|
|
86
|
-
sdkServer.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
87
|
-
tools: server.getTools()
|
|
88
|
-
}));
|
|
89
|
-
sdkServer.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
90
|
-
const { name, arguments: args } = request.params;
|
|
91
|
-
const progressToken = request.params._meta?.progressToken;
|
|
92
|
-
const options = progressToken !== undefined ? { progressToken } : undefined;
|
|
93
|
-
const result = await server.invokeTool(name, args ?? {}, options);
|
|
94
|
-
if (result.isErr()) {
|
|
95
|
-
return wrapToolError(result.error);
|
|
96
|
-
}
|
|
97
|
-
return wrapToolResult(result.value);
|
|
98
|
-
});
|
|
99
|
-
sdkServer.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
100
|
-
resources: server.getResources().map((r) => ({
|
|
101
|
-
uri: r.uri,
|
|
102
|
-
name: r.name,
|
|
103
|
-
...r.description ? { description: r.description } : {},
|
|
104
|
-
...r.mimeType ? { mimeType: r.mimeType } : {}
|
|
105
|
-
}))
|
|
106
|
-
}));
|
|
107
|
-
sdkServer.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({
|
|
108
|
-
resourceTemplates: server.getResourceTemplates().map((t) => ({
|
|
109
|
-
uriTemplate: t.uriTemplate,
|
|
110
|
-
name: t.name,
|
|
111
|
-
...t.description ? { description: t.description } : {},
|
|
112
|
-
...t.mimeType ? { mimeType: t.mimeType } : {}
|
|
113
|
-
}))
|
|
114
|
-
}));
|
|
115
|
-
sdkServer.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
116
|
-
const { uri } = request.params;
|
|
117
|
-
const result = await server.readResource(uri);
|
|
118
|
-
if (result.isErr()) {
|
|
119
|
-
throw toSdkError(result.error);
|
|
120
|
-
}
|
|
121
|
-
return { contents: result.value };
|
|
122
|
-
});
|
|
123
|
-
sdkServer.setRequestHandler(SubscribeRequestSchema, async (request) => {
|
|
124
|
-
server.subscribe(request.params.uri);
|
|
125
|
-
return {};
|
|
126
|
-
});
|
|
127
|
-
sdkServer.setRequestHandler(UnsubscribeRequestSchema, async (request) => {
|
|
128
|
-
server.unsubscribe(request.params.uri);
|
|
129
|
-
return {};
|
|
130
|
-
});
|
|
131
|
-
sdkServer.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
132
|
-
prompts: server.getPrompts()
|
|
133
|
-
}));
|
|
134
|
-
sdkServer.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
135
|
-
const { name, arguments: args } = request.params;
|
|
136
|
-
const result = await server.getPrompt(name, args ?? {});
|
|
137
|
-
if (result.isErr()) {
|
|
138
|
-
throw toSdkError(result.error);
|
|
139
|
-
}
|
|
140
|
-
return { ...result.value };
|
|
141
|
-
});
|
|
142
|
-
sdkServer.setRequestHandler(CompleteRequestSchema, async (request) => {
|
|
143
|
-
const { ref, argument } = request.params;
|
|
144
|
-
const completionRef = ref.type === "ref/prompt" ? { type: "ref/prompt", name: ref.name } : { type: "ref/resource", uri: ref.uri };
|
|
145
|
-
const result = await server.complete(completionRef, argument.name, argument.value);
|
|
146
|
-
if (result.isErr()) {
|
|
147
|
-
throw toSdkError(result.error);
|
|
148
|
-
}
|
|
149
|
-
return { completion: result.value };
|
|
150
|
-
});
|
|
151
|
-
sdkServer.setRequestHandler(SetLevelRequestSchema, async (request) => {
|
|
152
|
-
const level = request.params.level;
|
|
153
|
-
server.setLogLevel?.(level);
|
|
154
|
-
return {};
|
|
155
|
-
});
|
|
156
|
-
server.bindSdkServer?.(sdkServer);
|
|
157
|
-
return sdkServer;
|
|
158
|
-
}
|
|
159
|
-
async function connectStdio(server, transport = new StdioServerTransport) {
|
|
160
|
-
const sdkServer = createSdkServer(server);
|
|
161
|
-
await sdkServer.connect(transport);
|
|
162
|
-
return sdkServer;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export { wrapToolResult, wrapToolError, createSdkServer, connectStdio };
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import {
|
|
3
|
-
defineTool
|
|
4
|
-
} from "./mcp-hh12tqfg.js";
|
|
5
|
-
|
|
6
|
-
// packages/mcp/src/actions.ts
|
|
7
|
-
import { DEFAULT_REGISTRY_SURFACES } from "@outfitter/contracts";
|
|
8
|
-
function isActionRegistry(source) {
|
|
9
|
-
return "list" in source;
|
|
10
|
-
}
|
|
11
|
-
function buildMcpTools(source, options = {}) {
|
|
12
|
-
const actions = isActionRegistry(source) ? source.list() : source;
|
|
13
|
-
const includeSurfaces = options.includeSurfaces ?? [
|
|
14
|
-
"mcp"
|
|
15
|
-
];
|
|
16
|
-
return actions.filter((action) => {
|
|
17
|
-
const surfaces = action.surfaces ?? DEFAULT_REGISTRY_SURFACES;
|
|
18
|
-
return surfaces.some((surface) => includeSurfaces.includes(surface));
|
|
19
|
-
}).map((action) => defineTool({
|
|
20
|
-
name: action.mcp?.tool ?? action.id,
|
|
21
|
-
description: action.mcp?.description ?? action.description ?? action.id,
|
|
22
|
-
inputSchema: action.input,
|
|
23
|
-
handler: async (input, ctx) => action.handler(input, ctx),
|
|
24
|
-
...action.mcp?.deferLoading !== undefined ? { deferLoading: action.mcp.deferLoading } : {}
|
|
25
|
-
}));
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export { buildMcpTools };
|