@plurnk/plurnk-mcp 1.6.1 → 1.7.0
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/.env.defaults +6 -4
- package/README.md +110 -45
- package/SPEC.md +274 -30
- package/dist/McpExecutor.d.ts +25 -4
- package/dist/McpExecutor.d.ts.map +1 -1
- package/dist/McpExecutor.js +105 -31
- package/dist/McpExecutor.js.map +1 -1
- package/dist/McpResources.d.ts +2 -2
- package/dist/McpResources.d.ts.map +1 -1
- package/dist/McpResources.js +114 -24
- package/dist/McpResources.js.map +1 -1
- package/dist/Module.d.ts +30 -5
- package/dist/Module.d.ts.map +1 -1
- package/dist/Module.js +649 -35
- package/dist/Module.js.map +1 -1
- package/dist/ToolPresentation.d.ts +5 -0
- package/dist/ToolPresentation.d.ts.map +1 -0
- package/dist/ToolPresentation.js +134 -0
- package/dist/ToolPresentation.js.map +1 -0
- package/dist/client.d.ts +25 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +478 -85
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +7 -13
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +114 -45
- package/dist/config.js.map +1 -1
- package/dist/extensionChannel.d.ts +25 -0
- package/dist/extensionChannel.d.ts.map +1 -0
- package/dist/extensionChannel.js +195 -0
- package/dist/extensionChannel.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/inputRequired.d.ts +36 -0
- package/dist/inputRequired.d.ts.map +1 -0
- package/dist/inputRequired.js +171 -0
- package/dist/inputRequired.js.map +1 -0
- package/dist/oauth.d.ts +28 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +149 -0
- package/dist/oauth.js.map +1 -0
- package/dist/protocol.d.ts +7 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +7 -0
- package/dist/protocol.js.map +1 -0
- package/dist/protocolHeaders.d.ts +4 -0
- package/dist/protocolHeaders.d.ts.map +1 -0
- package/dist/protocolHeaders.js +87 -0
- package/dist/protocolHeaders.js.map +1 -0
- package/dist/subscriptions.d.ts +15 -0
- package/dist/subscriptions.d.ts.map +1 -0
- package/dist/subscriptions.js +188 -0
- package/dist/subscriptions.js.map +1 -0
- package/dist/tasks.d.ts +19 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +334 -0
- package/dist/tasks.js.map +1 -0
- package/package.json +10 -6
package/dist/McpExecutor.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { BaseExecutor, ErrorDetail, ERROR_DETAIL_LIMIT, renderJsonResult, Results, } from "@plurnk/plurnk-execs";
|
|
1
|
+
import { BaseExecutor, ErrorDetail, ERROR_DETAIL_LIMIT, renderJsonResult, Results, RuntimeInvocation, } from "@plurnk/plurnk-execs";
|
|
2
|
+
import { toolRegistry as presentTools } from "./ToolPresentation.js";
|
|
2
3
|
const CHANNEL = "body";
|
|
3
4
|
export const runtimeDecl = (name) => ({
|
|
4
5
|
name,
|
|
@@ -6,27 +7,39 @@ export const runtimeDecl = (name) => ({
|
|
|
6
7
|
invocation: {
|
|
7
8
|
body: { role: "JSON arguments", required: false },
|
|
8
9
|
target: { role: "MCP tool", required: true, kind: "literal" },
|
|
9
|
-
example: { target: "tool_name"
|
|
10
|
+
example: { target: "tool_name" },
|
|
10
11
|
},
|
|
11
|
-
documentation:
|
|
12
|
-
|
|
13
|
-
This configured MCP server is available as an executable tool family and an
|
|
14
|
-
addressable resource family.
|
|
15
|
-
|
|
16
|
-
\`\`\`plurnk
|
|
17
|
-
## READ0 (${name}:///)\n\n## EXEC0 [${name}] (tool_name)\n{"argument":"value"}
|
|
18
|
-
\`\`\`
|
|
19
|
-
|
|
20
|
-
READ returns the live catalog. Tool arguments are one JSON object. Tool results
|
|
21
|
-
are written to the operation's \`body\` channel.
|
|
22
|
-
`,
|
|
12
|
+
documentation: "",
|
|
23
13
|
});
|
|
24
14
|
const message = (error) => error instanceof Error ? error.message : String(error);
|
|
15
|
+
const progressNotice = (runtime, tool, progress) => ({
|
|
16
|
+
source: `exec:${runtime}`,
|
|
17
|
+
kind: "mcp_progress",
|
|
18
|
+
level: "info",
|
|
19
|
+
message: progress.message ?? (progress.total === undefined
|
|
20
|
+
? `MCP tool '${tool}' progressed to ${progress.progress}.`
|
|
21
|
+
: `MCP tool '${tool}' progressed to ${progress.progress}/${progress.total}.`),
|
|
22
|
+
tool,
|
|
23
|
+
progress: progress.progress,
|
|
24
|
+
...(progress.total === undefined ? {} : { total: progress.total }),
|
|
25
|
+
});
|
|
25
26
|
export default class McpExecutor extends BaseExecutor {
|
|
26
27
|
#connection;
|
|
27
|
-
|
|
28
|
+
#tools;
|
|
29
|
+
#read;
|
|
30
|
+
#registry = null;
|
|
31
|
+
#catalog = null;
|
|
32
|
+
constructor(metadata, connection, policy = {}) {
|
|
28
33
|
super(metadata);
|
|
29
34
|
this.#connection = connection;
|
|
35
|
+
this.#tools = policy.tools ?? null;
|
|
36
|
+
this.#read = new Set(policy.read ?? []);
|
|
37
|
+
}
|
|
38
|
+
get manifest() {
|
|
39
|
+
return {
|
|
40
|
+
...super.manifest,
|
|
41
|
+
example: `## FIND0 (${this.runtime}:///resources/**)`,
|
|
42
|
+
};
|
|
30
43
|
}
|
|
31
44
|
get channels() {
|
|
32
45
|
return {
|
|
@@ -36,9 +49,50 @@ export default class McpExecutor extends BaseExecutor {
|
|
|
36
49
|
};
|
|
37
50
|
}
|
|
38
51
|
effect(target) {
|
|
39
|
-
if (target === null || target
|
|
40
|
-
|
|
41
|
-
|
|
52
|
+
if (target === null || !this.#enabledTargets().has(target)) {
|
|
53
|
+
throw new Error(`MCP effect classification received unregistered target '${target ?? ""}' on '${this.runtime}'.`);
|
|
54
|
+
}
|
|
55
|
+
return this.#read.has(target) ? "read" : "host";
|
|
56
|
+
}
|
|
57
|
+
#selectTools(tools) {
|
|
58
|
+
const available = new Set(tools.map((tool) => tool.name));
|
|
59
|
+
if (available.size !== tools.length) {
|
|
60
|
+
throw new Error(`MCP server '${this.runtime}' returned duplicate tool names.`);
|
|
61
|
+
}
|
|
62
|
+
const configured = this.#tools ?? [];
|
|
63
|
+
for (const name of configured) {
|
|
64
|
+
if (!available.has(name)) {
|
|
65
|
+
throw new Error(`Configured MCP tool '${name}' is absent from server '${this.runtime}'.`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const selected = this.#tools === null
|
|
69
|
+
? tools
|
|
70
|
+
: tools.filter((tool) => this.#tools?.includes(tool.name));
|
|
71
|
+
const enabled = new Set(selected.map((tool) => tool.name));
|
|
72
|
+
for (const name of this.#read) {
|
|
73
|
+
if (!enabled.has(name)) {
|
|
74
|
+
throw new Error(`Read-classified MCP tool '${name}' is not enabled on server '${this.runtime}'.`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return selected;
|
|
78
|
+
}
|
|
79
|
+
#enabledTargets() {
|
|
80
|
+
if (this.#registry === null) {
|
|
81
|
+
throw new Error(`MCP tool registry for '${this.runtime}' was read before availability was established.`);
|
|
82
|
+
}
|
|
83
|
+
return new Set(this.#registry.tools.map((tool) => tool.target));
|
|
84
|
+
}
|
|
85
|
+
toolRegistry() {
|
|
86
|
+
if (this.#registry === null) {
|
|
87
|
+
throw new Error(`MCP tool registry for '${this.runtime}' was read before availability was established.`);
|
|
88
|
+
}
|
|
89
|
+
return this.#registry;
|
|
90
|
+
}
|
|
91
|
+
get catalog() {
|
|
92
|
+
if (this.#catalog === null) {
|
|
93
|
+
throw new Error(`MCP catalog for '${this.runtime}' was read before availability was established.`);
|
|
94
|
+
}
|
|
95
|
+
return this.#catalog;
|
|
42
96
|
}
|
|
43
97
|
async probe(signal) {
|
|
44
98
|
const detailLimit = ErrorDetail.configuredLimit();
|
|
@@ -49,16 +103,7 @@ export default class McpExecutor extends BaseExecutor {
|
|
|
49
103
|
};
|
|
50
104
|
}
|
|
51
105
|
try {
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
available: true,
|
|
55
|
-
detail: [
|
|
56
|
-
`MCP ${catalog.protocolVersion}`,
|
|
57
|
-
`${catalog.tools.length} tools`,
|
|
58
|
-
`${catalog.resources.length} resources`,
|
|
59
|
-
`${catalog.prompts.length} prompts`,
|
|
60
|
-
].join("; "),
|
|
61
|
-
};
|
|
106
|
+
return await this.requireAvailable(signal);
|
|
62
107
|
}
|
|
63
108
|
catch (error) {
|
|
64
109
|
return {
|
|
@@ -67,7 +112,25 @@ export default class McpExecutor extends BaseExecutor {
|
|
|
67
112
|
};
|
|
68
113
|
}
|
|
69
114
|
}
|
|
70
|
-
async
|
|
115
|
+
async requireAvailable(signal) {
|
|
116
|
+
if (ErrorDetail.configuredLimit() === null) {
|
|
117
|
+
throw new Error(`${ERROR_DETAIL_LIMIT} must be set to a non-negative integer.`);
|
|
118
|
+
}
|
|
119
|
+
const catalog = await this.#connection.catalog(signal);
|
|
120
|
+
const selected = this.#selectTools(catalog.tools);
|
|
121
|
+
this.#registry = RuntimeInvocation.assertToolRegistry(presentTools(this.runtime, selected), "@plurnk/plurnk-mcp", this.runtime);
|
|
122
|
+
this.#catalog = catalog;
|
|
123
|
+
return {
|
|
124
|
+
available: true,
|
|
125
|
+
detail: [
|
|
126
|
+
`MCP ${catalog.protocolVersion}`,
|
|
127
|
+
`${catalog.tools.length} tools`,
|
|
128
|
+
`${catalog.resources.length} resources`,
|
|
129
|
+
`${catalog.prompts.length} prompts`,
|
|
130
|
+
].join("; "),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
async run({ runtime, body, target, signal, write, setState, emit, interact, }) {
|
|
71
134
|
const fail = (code, status, detail, extensions) => {
|
|
72
135
|
setState(CHANNEL, "errored");
|
|
73
136
|
return Results.failure("executor:mcp", code, status, detail, {}, {
|
|
@@ -84,7 +147,14 @@ export default class McpExecutor extends BaseExecutor {
|
|
|
84
147
|
const input = body.trim();
|
|
85
148
|
if (target === null || target.length === 0) {
|
|
86
149
|
return fail("tool-required", 400, `MCP executor '${runtime}' requires a tool target.`, {
|
|
87
|
-
recovery:
|
|
150
|
+
recovery: "Select a target listed for this executor in Registered Tools.",
|
|
151
|
+
retryable: false,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (!this.#enabledTargets().has(target)) {
|
|
155
|
+
return fail("tool-not-enabled", 404, `MCP tool '${target}' is not enabled on '${runtime}'.`, {
|
|
156
|
+
tool: target,
|
|
157
|
+
recovery: "Select a target listed for this executor in Registered Tools.",
|
|
88
158
|
retryable: false,
|
|
89
159
|
});
|
|
90
160
|
}
|
|
@@ -106,7 +176,11 @@ export default class McpExecutor extends BaseExecutor {
|
|
|
106
176
|
}
|
|
107
177
|
}
|
|
108
178
|
try {
|
|
109
|
-
const
|
|
179
|
+
const tool = this.#catalog?.tools.find((candidate) => candidate.name === target);
|
|
180
|
+
if (tool === undefined) {
|
|
181
|
+
throw new Error(`MCP tool '${target}' is absent from the prepared catalog.`);
|
|
182
|
+
}
|
|
183
|
+
const result = await this.#connection.callTool(target, args, signal, (progress) => emit(progressNotice(runtime, target, progress)), interact, tool);
|
|
110
184
|
write(CHANNEL, renderJsonResult(result), "application/json");
|
|
111
185
|
if (result.isError === true) {
|
|
112
186
|
return fail("tool-reported-error", 502, `MCP tool '${target}' on '${runtime}' reported an error.`, {
|
package/dist/McpExecutor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpExecutor.js","sourceRoot":"","sources":["../src/McpExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,
|
|
1
|
+
{"version":3,"file":"McpExecutor.js","sourceRoot":"","sources":["../src/McpExecutor.ts"],"names":[],"mappings":"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"}
|
package/dist/McpResources.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type EntryFindResult, type FindStatement, type RepresentationPreparationRequest, type RepresentationPreparationResult, type SchemeCtx } from "@plurnk/plurnk-schemes";
|
|
2
|
-
import ServerConnection from "./client.ts";
|
|
2
|
+
import ServerConnection, { type ServerCatalog } from "./client.ts";
|
|
3
3
|
export default class McpResources {
|
|
4
4
|
#private;
|
|
5
|
-
constructor(server: string, connection: ServerConnection);
|
|
5
|
+
constructor(server: string, connection: ServerConnection, catalog: ServerCatalog);
|
|
6
6
|
claims(pathname: string): boolean;
|
|
7
7
|
prepareRepresentation(request: RepresentationPreparationRequest, ctx: SchemeCtx): Promise<RepresentationPreparationResult>;
|
|
8
8
|
find(statement: FindStatement, ctx: SchemeCtx): Promise<EntryFindResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpResources.d.ts","sourceRoot":"","sources":["../src/McpResources.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"McpResources.d.ts","sourceRoot":"","sources":["../src/McpResources.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,eAAe,EAGpB,KAAK,aAAa,EAClB,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,SAAS,EAEjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,gBAAgB,EAAE,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAoInE,MAAM,CAAC,OAAO,OAAO,YAAY;;IAK7B,YAAY,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAI/E;IAED,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMhC;IAkIK,qBAAqB,CACvB,OAAO,EAAE,gCAAgC,EACzC,GAAG,EAAE,SAAS,GACf,OAAO,CAAC,+BAA+B,CAAC,CA+B1C;IAEK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAiB7E;CACJ"}
|
package/dist/McpResources.js
CHANGED
|
@@ -2,11 +2,30 @@ import { Results, } from "@plurnk/plurnk-schemes";
|
|
|
2
2
|
const ROOT = "/";
|
|
3
3
|
const RESOURCES = "/resources";
|
|
4
4
|
const RESOURCE_PREFIX = `${RESOURCES}/`;
|
|
5
|
+
const PROMPTS = "/prompts";
|
|
6
|
+
const PROMPT_PREFIX = `${PROMPTS}/`;
|
|
5
7
|
const RESOURCE_KIND = "mcp-resource";
|
|
6
8
|
const CATALOG_KIND = "mcp-resource-catalog";
|
|
9
|
+
const PROMPT_KIND = "mcp-prompt";
|
|
7
10
|
class ResourceAddressError extends Error {
|
|
8
11
|
}
|
|
12
|
+
class EntryOperationFailure extends Error {
|
|
13
|
+
result;
|
|
14
|
+
constructor(result) {
|
|
15
|
+
super(result.problem?.detail ?? `Entry operation failed with status ${result.status}.`, {
|
|
16
|
+
cause: result.problem,
|
|
17
|
+
});
|
|
18
|
+
this.result = result;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const requireEntrySuccess = (result) => {
|
|
22
|
+
const exact = Results.assert(result);
|
|
23
|
+
if (Results.isErrorStatus(exact.status))
|
|
24
|
+
throw new EntryOperationFailure(exact);
|
|
25
|
+
return exact;
|
|
26
|
+
};
|
|
9
27
|
const resourcePath = (uri) => `${RESOURCE_PREFIX}${encodeURIComponent(uri)}`;
|
|
28
|
+
const promptPath = (name) => `${PROMPT_PREFIX}${encodeURIComponent(name)}`;
|
|
10
29
|
const preparationFailure = (server, code, status, detail, extensions) => Results.failure("scheme:mcp", code, status, detail, {}, {
|
|
11
30
|
server,
|
|
12
31
|
stage: "mcp-resource",
|
|
@@ -25,6 +44,21 @@ const findFailure = (server, code, status, detail, extensions) => Results.failur
|
|
|
25
44
|
stage: "mcp-resource",
|
|
26
45
|
...extensions,
|
|
27
46
|
});
|
|
47
|
+
const preparationEntryFailure = (failure) => Results.assertRepresentationPreparation({
|
|
48
|
+
status: failure.result.status,
|
|
49
|
+
problem: failure.result.problem,
|
|
50
|
+
});
|
|
51
|
+
const findEntryFailure = (failure) => Results.assert({
|
|
52
|
+
status: failure.result.status,
|
|
53
|
+
problem: failure.result.problem,
|
|
54
|
+
content: null,
|
|
55
|
+
mimetype: null,
|
|
56
|
+
results: [],
|
|
57
|
+
itemsWeightTotal: 0,
|
|
58
|
+
returnedItemsWeightTotal: 0,
|
|
59
|
+
matchingPathCount: 0,
|
|
60
|
+
matchLocationCount: 0,
|
|
61
|
+
});
|
|
28
62
|
const resourceBody = (result) => {
|
|
29
63
|
if (result.contents.length === 1 && "text" in result.contents[0]) {
|
|
30
64
|
const value = result.contents[0];
|
|
@@ -50,40 +84,88 @@ const catalogEntry = (content, kind) => ({
|
|
|
50
84
|
export default class McpResources {
|
|
51
85
|
#server;
|
|
52
86
|
#connection;
|
|
53
|
-
|
|
87
|
+
#catalog;
|
|
88
|
+
constructor(server, connection, catalog) {
|
|
54
89
|
this.#server = server;
|
|
55
90
|
this.#connection = connection;
|
|
91
|
+
this.#catalog = catalog;
|
|
56
92
|
}
|
|
57
93
|
claims(pathname) {
|
|
58
94
|
return pathname === ROOT
|
|
59
95
|
|| pathname === RESOURCES
|
|
60
|
-
|| pathname.startsWith(RESOURCE_PREFIX)
|
|
96
|
+
|| pathname.startsWith(RESOURCE_PREFIX)
|
|
97
|
+
|| pathname === PROMPTS
|
|
98
|
+
|| pathname.startsWith(PROMPT_PREFIX);
|
|
61
99
|
}
|
|
62
100
|
async #materializeCatalog(ctx) {
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
})
|
|
70
|
-
})
|
|
71
|
-
await ctx.entries.write(
|
|
72
|
-
resources
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
101
|
+
const resources = this.#catalog.resources.map((resource) => ({
|
|
102
|
+
...resource,
|
|
103
|
+
address: `${this.#server}://${resourcePath(resource.uri)}`,
|
|
104
|
+
}));
|
|
105
|
+
const prompts = this.#catalog.prompts.map((prompt) => ({
|
|
106
|
+
...prompt,
|
|
107
|
+
address: `${this.#server}://${promptPath(prompt.name)}`,
|
|
108
|
+
}));
|
|
109
|
+
requireEntrySuccess(await ctx.entries.write(ROOT, catalogEntry(JSON.stringify({
|
|
110
|
+
resources,
|
|
111
|
+
resourceTemplates: this.#catalog.resourceTemplates,
|
|
112
|
+
prompts,
|
|
113
|
+
}), "mcp-resource-index")));
|
|
114
|
+
requireEntrySuccess(await ctx.entries.write(RESOURCES, catalogEntry(JSON.stringify({
|
|
115
|
+
resources,
|
|
116
|
+
resourceTemplates: this.#catalog.resourceTemplates,
|
|
117
|
+
}), "mcp-resource-index")));
|
|
118
|
+
requireEntrySuccess(await ctx.entries.write(PROMPTS, catalogEntry(JSON.stringify({ prompts }), "mcp-prompt-index")));
|
|
119
|
+
await Promise.all(this.#catalog.resources.map(async (resource) => {
|
|
79
120
|
const pathname = resourcePath(resource.uri);
|
|
80
|
-
const existing = await ctx.entries.read(pathname);
|
|
121
|
+
const existing = requireEntrySuccess(await ctx.entries.read(pathname));
|
|
81
122
|
if (existing.entry?.attributes?.kind === RESOURCE_KIND)
|
|
82
123
|
return;
|
|
83
|
-
await ctx.entries.write(pathname, catalogEntry(JSON.stringify({
|
|
124
|
+
requireEntrySuccess(await ctx.entries.write(pathname, catalogEntry(JSON.stringify({
|
|
84
125
|
...resource,
|
|
85
126
|
address: `${this.#server}://${pathname}`,
|
|
86
|
-
}), CATALOG_KIND));
|
|
127
|
+
}), CATALOG_KIND)));
|
|
128
|
+
}));
|
|
129
|
+
await Promise.all(this.#catalog.prompts.map(async (prompt) => {
|
|
130
|
+
const pathname = promptPath(prompt.name);
|
|
131
|
+
const existing = requireEntrySuccess(await ctx.entries.read(pathname));
|
|
132
|
+
if (existing.entry?.attributes?.kind === PROMPT_KIND)
|
|
133
|
+
return;
|
|
134
|
+
requireEntrySuccess(await ctx.entries.write(pathname, catalogEntry(JSON.stringify({
|
|
135
|
+
...prompt,
|
|
136
|
+
address: `${this.#server}://${pathname}`,
|
|
137
|
+
}), "mcp-prompt-catalog")));
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
async #materializePrompt(request, ctx) {
|
|
141
|
+
const encoded = request.pathname.slice(PROMPT_PREFIX.length);
|
|
142
|
+
if (encoded.length === 0 || encoded.includes("/")) {
|
|
143
|
+
throw new ResourceAddressError(`Invalid MCP prompt address '${request.pathname}'.`);
|
|
144
|
+
}
|
|
145
|
+
let name;
|
|
146
|
+
try {
|
|
147
|
+
name = decodeURIComponent(encoded);
|
|
148
|
+
}
|
|
149
|
+
catch (cause) {
|
|
150
|
+
throw new ResourceAddressError(`Invalid encoded MCP prompt address '${request.pathname}'.`, { cause });
|
|
151
|
+
}
|
|
152
|
+
const search = new URLSearchParams(request.target.kind === "url" ? request.target.query ?? "" : "");
|
|
153
|
+
const args = {};
|
|
154
|
+
for (const [key, value] of search) {
|
|
155
|
+
if (Object.hasOwn(args, key)) {
|
|
156
|
+
throw new ResourceAddressError(`MCP prompt argument '${key}' occurs more than once.`);
|
|
157
|
+
}
|
|
158
|
+
args[key] = value;
|
|
159
|
+
}
|
|
160
|
+
const result = await this.#connection.getPrompt(name, Object.keys(args).length === 0 ? undefined : args, ctx.signal, (interaction) => ctx.interactions.request(interaction));
|
|
161
|
+
requireEntrySuccess(await ctx.entries.write(request.pathname, {
|
|
162
|
+
channels: {
|
|
163
|
+
body: {
|
|
164
|
+
content: JSON.stringify(result),
|
|
165
|
+
mimetype: "application/json",
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
attributes: { kind: PROMPT_KIND },
|
|
87
169
|
}));
|
|
88
170
|
}
|
|
89
171
|
async #materializeResource(pathname, ctx) {
|
|
@@ -98,8 +180,8 @@ export default class McpResources {
|
|
|
98
180
|
catch (cause) {
|
|
99
181
|
throw new ResourceAddressError(`Invalid encoded MCP resource address '${pathname}'.`, { cause });
|
|
100
182
|
}
|
|
101
|
-
const body = resourceBody(await this.#connection.readResource(uri, ctx.signal));
|
|
102
|
-
await ctx.entries.write(pathname, {
|
|
183
|
+
const body = resourceBody(await this.#connection.readResource(uri, ctx.signal, (interaction) => ctx.interactions.request(interaction)));
|
|
184
|
+
requireEntrySuccess(await ctx.entries.write(pathname, {
|
|
103
185
|
channels: {
|
|
104
186
|
body: {
|
|
105
187
|
content: body.content,
|
|
@@ -107,7 +189,7 @@ export default class McpResources {
|
|
|
107
189
|
},
|
|
108
190
|
},
|
|
109
191
|
attributes: { kind: RESOURCE_KIND },
|
|
110
|
-
});
|
|
192
|
+
}));
|
|
111
193
|
}
|
|
112
194
|
async prepareRepresentation(request, ctx) {
|
|
113
195
|
const pathname = request.pathname;
|
|
@@ -117,12 +199,18 @@ export default class McpResources {
|
|
|
117
199
|
if (exactResource) {
|
|
118
200
|
await this.#materializeResource(pathname, ctx);
|
|
119
201
|
}
|
|
202
|
+
else if (pathname.startsWith(PROMPT_PREFIX) && !/[*?[\]{}]/.test(pathname)) {
|
|
203
|
+
await this.#materializePrompt(request, ctx);
|
|
204
|
+
}
|
|
120
205
|
else {
|
|
121
206
|
await this.#materializeCatalog(ctx);
|
|
122
207
|
}
|
|
123
208
|
return { status: 200 };
|
|
124
209
|
}
|
|
125
210
|
catch (error) {
|
|
211
|
+
if (error instanceof EntryOperationFailure) {
|
|
212
|
+
return preparationEntryFailure(error);
|
|
213
|
+
}
|
|
126
214
|
const invalidAddress = error instanceof ResourceAddressError;
|
|
127
215
|
return preparationFailure(this.#server, invalidAddress ? "resource-address-invalid" : "resource-read-failed", invalidAddress ? 400 : 502, invalidAddress
|
|
128
216
|
? `The requested MCP resource address for '${this.#server}' is invalid.`
|
|
@@ -138,6 +226,8 @@ export default class McpResources {
|
|
|
138
226
|
return await ctx.entries.operations.find(statement);
|
|
139
227
|
}
|
|
140
228
|
catch (error) {
|
|
229
|
+
if (error instanceof EntryOperationFailure)
|
|
230
|
+
return findEntryFailure(error);
|
|
141
231
|
return findFailure(this.#server, "resource-find-failed", 502, `MCP server '${this.#server}' could not list its resources.`, {
|
|
142
232
|
diagnostic: error instanceof Error ? error.message : String(error),
|
|
143
233
|
retryable: true,
|
package/dist/McpResources.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpResources.js","sourceRoot":"","sources":["../src/McpResources.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,
|
|
1
|
+
{"version":3,"file":"McpResources.js","sourceRoot":"","sources":["../src/McpResources.ts"],"names":[],"mappings":"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"}
|
package/dist/Module.d.ts
CHANGED
|
@@ -6,18 +6,43 @@ interface RuntimeSchemeFacet {
|
|
|
6
6
|
prepareRepresentation?(request: RepresentationPreparationRequest, ctx: SchemeCtx): Promise<RepresentationPreparationResult>;
|
|
7
7
|
find?(statement: FindStatement, ctx: SchemeCtx): Promise<SchemeResult>;
|
|
8
8
|
}
|
|
9
|
+
interface RuntimeRegistration {
|
|
10
|
+
readonly namespaceOwner: string;
|
|
11
|
+
readonly decl: RuntimeDecl;
|
|
12
|
+
readonly executor: McpExecutor;
|
|
13
|
+
readonly availability: RuntimeAvailability;
|
|
14
|
+
readonly scheme?: RuntimeSchemeFacet;
|
|
15
|
+
}
|
|
16
|
+
type ModuleActionContext = {
|
|
17
|
+
readonly scope: "worldless";
|
|
18
|
+
} | {
|
|
19
|
+
readonly scope: "workspace";
|
|
20
|
+
readonly workspaceId: number;
|
|
21
|
+
};
|
|
9
22
|
interface ModuleSetupSeam {
|
|
10
|
-
|
|
23
|
+
registerModuleAction(registration: {
|
|
24
|
+
readonly name: string;
|
|
25
|
+
readonly scope: "worldless" | "workspace";
|
|
26
|
+
readonly handler: (params: Readonly<Record<string, unknown>>, context: ModuleActionContext) => unknown | Promise<unknown>;
|
|
27
|
+
}): void;
|
|
28
|
+
registerWorkspaceCapabilityProvider(namespaceOwner: string, provider: {
|
|
29
|
+
hydrate(workspaceId: number): void | Promise<void>;
|
|
30
|
+
}): void;
|
|
31
|
+
readWorkspaceModuleState(workspaceId: number, namespaceOwner: string): Promise<unknown | null>;
|
|
32
|
+
replaceWorkspaceCapabilities(replacement: {
|
|
33
|
+
readonly workspaceId: number;
|
|
11
34
|
readonly namespaceOwner: string;
|
|
12
|
-
readonly
|
|
13
|
-
readonly
|
|
14
|
-
readonly availability: RuntimeAvailability;
|
|
15
|
-
readonly scheme?: RuntimeSchemeFacet;
|
|
35
|
+
readonly state: unknown | null;
|
|
36
|
+
readonly runtimes: readonly RuntimeRegistration[];
|
|
16
37
|
}): Promise<void>;
|
|
17
38
|
}
|
|
18
39
|
export interface ModuleOptions {
|
|
19
40
|
readonly env?: NodeJS.ProcessEnv;
|
|
20
41
|
}
|
|
42
|
+
interface ClosableConnection {
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
export declare const closeConnections: (connections: readonly ClosableConnection[]) => Promise<void>;
|
|
21
46
|
export default class Module {
|
|
22
47
|
#private;
|
|
23
48
|
static init(options?: ModuleOptions): Module;
|
package/dist/Module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Module.d.ts","sourceRoot":"","sources":["../src/Module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,mBAAmB,EACnB,WAAW,EACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACR,aAAa,EACb,gCAAgC,EAChC,+BAA+B,EAC/B,SAAS,EACT,YAAY,EACf,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"Module.d.ts","sourceRoot":"","sources":["../src/Module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,mBAAmB,EACnB,WAAW,EACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACR,aAAa,EACb,gCAAgC,EAChC,+BAA+B,EAC/B,SAAS,EACT,YAAY,EACf,MAAM,wBAAwB,CAAC;AAahC,OAAO,WAA4B,MAAM,kBAAkB,CAAC;AAO5D,UAAU,kBAAkB;IACxB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,qBAAqB,CAAC,CAClB,OAAO,EAAE,gCAAgC,EACzC,GAAG,EAAE,SAAS,GACf,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC1E;AAED,UAAU,mBAAmB;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CACxC;AAED,KAAK,mBAAmB,GAClB;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,UAAU,eAAe;IACrB,oBAAoB,CAAC,YAAY,EAAE;QAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAAC;QAC1C,QAAQ,CAAC,OAAO,EAAE,CACd,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,OAAO,EAAE,mBAAmB,KAC3B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACnC,GAAG,IAAI,CAAC;IACT,mCAAmC,CAC/B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE;QAAE,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,GACjE,IAAI,CAAC;IACR,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/F,4BAA4B,CAAC,WAAW,EAAE;QACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;QAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;KACrD,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAsDD,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACpC;AAED,UAAU,kBAAkB;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAgGD,eAAO,MAAM,gBAAgB,gBACZ,SAAS,kBAAkB,EAAE,KAC3C,OAAO,CAAC,IAAI,CAUd,CAAC;AA2FF,MAAM,CAAC,OAAO,OAAO,MAAM;;IAUvB,MAAM,CAAC,IAAI,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAE/C;IAED,OAAO,eAKN;IAEK,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhD;IAmmBK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAe3B;CACJ"}
|