@executor-js/plugin-mcp 0.0.2 → 0.2.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/dist/AddMcpSource-VM3HY26S.js +762 -0
- package/dist/AddMcpSource-VM3HY26S.js.map +1 -0
- package/dist/EditMcpSource-WELWGRJG.js +259 -0
- package/dist/EditMcpSource-WELWGRJG.js.map +1 -0
- package/dist/McpSourceSummary-7TDQXLT5.js +85 -0
- package/dist/McpSourceSummary-7TDQXLT5.js.map +1 -0
- package/dist/api/group.d.ts +115 -23
- package/dist/api/index.d.ts +391 -0
- package/dist/chunk-2ETJ6LQH.js +239 -0
- package/dist/chunk-2ETJ6LQH.js.map +1 -0
- package/dist/chunk-OOOH3IO4.js +2194 -0
- package/dist/chunk-OOOH3IO4.js.map +1 -0
- package/dist/chunk-SKSXXFOA.js +104 -0
- package/dist/chunk-SKSXXFOA.js.map +1 -0
- package/dist/chunk-Z4CRPOLI.js +186 -0
- package/dist/chunk-Z4CRPOLI.js.map +1 -0
- package/dist/chunk-ZIRGIRGP.js +115 -0
- package/dist/chunk-ZIRGIRGP.js.map +1 -0
- package/dist/client.js +51 -0
- package/dist/client.js.map +1 -0
- package/dist/core.js +26 -2
- package/dist/index.js +2 -1
- package/dist/react/McpRemoteSourceFields.d.ts +18 -0
- package/dist/react/McpSourceSummary.d.ts +5 -0
- package/dist/react/atoms.d.ts +211 -11
- package/dist/react/client.d.ts +114 -350
- package/dist/react/index.d.ts +1 -1
- package/dist/react/plugin-client.d.ts +9 -0
- package/dist/react/source-plugin.d.ts +1 -1
- package/dist/sdk/binding-store.d.ts +110 -1
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/invoke.d.ts +2 -0
- package/dist/sdk/manifest.d.ts +2 -0
- package/dist/sdk/plugin.d.ts +168 -10
- package/dist/sdk/probe-shape-real-servers.live.test.d.ts +1 -0
- package/dist/sdk/probe-shape.d.ts +17 -3
- package/dist/sdk/stored-source.d.ts +9 -6
- package/dist/sdk/types.d.ts +153 -13
- package/dist/{stdio-connector-KNHLETKM.js → stdio-connector-AA5S6UUJ.js} +1 -1
- package/dist/{stdio-connector-KNHLETKM.js.map → stdio-connector-AA5S6UUJ.js.map} +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/server.d.ts +10 -0
- package/dist/testing.js +51 -0
- package/dist/testing.js.map +1 -0
- package/package.json +17 -4
- package/dist/chunk-DJANY5EU.js +0 -1325
- package/dist/chunk-DJANY5EU.js.map +0 -1
package/dist/react/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { mcpSourcePlugin, createMcpSourcePlugin } from "./source-plugin";
|
|
2
2
|
export type { McpSourcePluginOptions } from "./source-plugin";
|
|
3
3
|
export { McpClient } from "./client";
|
|
4
|
-
export { probeMcpEndpoint, addMcpSource, removeMcpSource, refreshMcpSource
|
|
4
|
+
export { probeMcpEndpoint, addMcpSource, removeMcpSource, refreshMcpSource } from "./atoms";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface McpClientConfig {
|
|
2
|
+
/**
|
|
3
|
+
* Mirrors `dangerouslyAllowStdioMCP` on the server-side plugin. When
|
|
4
|
+
* false, the AddMcpSource UI hides the stdio tab and stdio presets.
|
|
5
|
+
* Defaults to false — same default as the server flag.
|
|
6
|
+
*/
|
|
7
|
+
readonly allowStdio?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export default function createMcpClientPlugin(config?: McpClientConfig): import("@executor-js/sdk/client").ClientPluginSpec<"mcp">;
|
|
@@ -21,12 +21,117 @@ export declare const mcpSchema: {
|
|
|
21
21
|
readonly type: "json";
|
|
22
22
|
readonly required: true;
|
|
23
23
|
};
|
|
24
|
+
readonly auth_kind: {
|
|
25
|
+
readonly type: ["none", "header", "oauth2"];
|
|
26
|
+
readonly required: true;
|
|
27
|
+
readonly defaultValue: "none";
|
|
28
|
+
};
|
|
29
|
+
readonly auth_header_name: {
|
|
30
|
+
readonly type: "string";
|
|
31
|
+
readonly required: false;
|
|
32
|
+
};
|
|
33
|
+
readonly auth_header_slot: {
|
|
34
|
+
readonly type: "string";
|
|
35
|
+
readonly required: false;
|
|
36
|
+
};
|
|
37
|
+
readonly auth_header_prefix: {
|
|
38
|
+
readonly type: "string";
|
|
39
|
+
readonly required: false;
|
|
40
|
+
};
|
|
41
|
+
readonly auth_connection_slot: {
|
|
42
|
+
readonly type: "string";
|
|
43
|
+
readonly required: false;
|
|
44
|
+
};
|
|
45
|
+
readonly auth_client_id_slot: {
|
|
46
|
+
readonly type: "string";
|
|
47
|
+
readonly required: false;
|
|
48
|
+
};
|
|
49
|
+
readonly auth_client_secret_slot: {
|
|
50
|
+
readonly type: "string";
|
|
51
|
+
readonly required: false;
|
|
52
|
+
};
|
|
24
53
|
readonly created_at: {
|
|
25
54
|
readonly type: "date";
|
|
26
55
|
readonly required: true;
|
|
27
56
|
};
|
|
28
57
|
};
|
|
29
58
|
};
|
|
59
|
+
readonly mcp_source_header: {
|
|
60
|
+
readonly fields: {
|
|
61
|
+
readonly id: {
|
|
62
|
+
readonly type: "string";
|
|
63
|
+
readonly required: true;
|
|
64
|
+
};
|
|
65
|
+
readonly scope_id: {
|
|
66
|
+
readonly type: "string";
|
|
67
|
+
readonly required: true;
|
|
68
|
+
readonly index: true;
|
|
69
|
+
};
|
|
70
|
+
readonly source_id: {
|
|
71
|
+
readonly type: "string";
|
|
72
|
+
readonly required: true;
|
|
73
|
+
readonly index: true;
|
|
74
|
+
};
|
|
75
|
+
readonly name: {
|
|
76
|
+
readonly type: "string";
|
|
77
|
+
readonly required: true;
|
|
78
|
+
};
|
|
79
|
+
readonly kind: {
|
|
80
|
+
readonly type: ["text", "binding"];
|
|
81
|
+
readonly required: true;
|
|
82
|
+
};
|
|
83
|
+
readonly text_value: {
|
|
84
|
+
readonly type: "string";
|
|
85
|
+
readonly required: false;
|
|
86
|
+
};
|
|
87
|
+
readonly slot_key: {
|
|
88
|
+
readonly type: "string";
|
|
89
|
+
readonly required: false;
|
|
90
|
+
};
|
|
91
|
+
readonly prefix: {
|
|
92
|
+
readonly type: "string";
|
|
93
|
+
readonly required: false;
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
readonly mcp_source_query_param: {
|
|
98
|
+
readonly fields: {
|
|
99
|
+
readonly id: {
|
|
100
|
+
readonly type: "string";
|
|
101
|
+
readonly required: true;
|
|
102
|
+
};
|
|
103
|
+
readonly scope_id: {
|
|
104
|
+
readonly type: "string";
|
|
105
|
+
readonly required: true;
|
|
106
|
+
readonly index: true;
|
|
107
|
+
};
|
|
108
|
+
readonly source_id: {
|
|
109
|
+
readonly type: "string";
|
|
110
|
+
readonly required: true;
|
|
111
|
+
readonly index: true;
|
|
112
|
+
};
|
|
113
|
+
readonly name: {
|
|
114
|
+
readonly type: "string";
|
|
115
|
+
readonly required: true;
|
|
116
|
+
};
|
|
117
|
+
readonly kind: {
|
|
118
|
+
readonly type: ["text", "binding"];
|
|
119
|
+
readonly required: true;
|
|
120
|
+
};
|
|
121
|
+
readonly text_value: {
|
|
122
|
+
readonly type: "string";
|
|
123
|
+
readonly required: false;
|
|
124
|
+
};
|
|
125
|
+
readonly slot_key: {
|
|
126
|
+
readonly type: "string";
|
|
127
|
+
readonly required: false;
|
|
128
|
+
};
|
|
129
|
+
readonly prefix: {
|
|
130
|
+
readonly type: "string";
|
|
131
|
+
readonly required: false;
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
};
|
|
30
135
|
readonly mcp_binding: {
|
|
31
136
|
readonly fields: {
|
|
32
137
|
readonly id: {
|
|
@@ -65,6 +170,10 @@ export interface McpStoredSource {
|
|
|
65
170
|
readonly config: McpStoredSourceData;
|
|
66
171
|
}
|
|
67
172
|
export interface McpBindingStore {
|
|
173
|
+
readonly listBindingsBySource: (namespace: string, scope: string) => Effect.Effect<ReadonlyArray<{
|
|
174
|
+
readonly toolId: string;
|
|
175
|
+
readonly binding: McpToolBinding;
|
|
176
|
+
}>, StorageFailure>;
|
|
68
177
|
readonly getBinding: (toolId: string, scope: string) => Effect.Effect<{
|
|
69
178
|
readonly binding: McpToolBinding;
|
|
70
179
|
readonly namespace: string;
|
|
@@ -79,4 +188,4 @@ export interface McpBindingStore {
|
|
|
79
188
|
readonly putSource: (source: McpStoredSource) => Effect.Effect<void, StorageFailure>;
|
|
80
189
|
readonly removeSource: (namespace: string, scope: string) => Effect.Effect<void, StorageFailure>;
|
|
81
190
|
}
|
|
82
|
-
export declare const makeMcpStore: ({ adapter: db
|
|
191
|
+
export declare const makeMcpStore: ({ adapter: db }: StorageDeps<McpSchema>) => McpBindingStore;
|
package/dist/sdk/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { mcpPlugin, type McpPluginExtension, type McpPluginOptions, type McpSourceConfig, type McpRemoteSourceConfig, type McpStdioSourceConfig, type McpProbeResult, type McpUpdateSourceInput, } from "./plugin";
|
|
2
2
|
export { makeMcpStore, mcpSchema, type McpBindingStore, type McpSchema, type McpStoredSource, } from "./binding-store";
|
|
3
|
-
export { McpConnectionAuth } from "./types";
|
|
3
|
+
export { ConfiguredMcpCredentialValue, MCP_HEADER_AUTH_SLOT, MCP_OAUTH_CLIENT_ID_SLOT, MCP_OAUTH_CLIENT_SECRET_SLOT, MCP_OAUTH_CONNECTION_SLOT, McpConnectionAuth, McpConnectionAuthInput, McpCredentialInput, McpSourceBindingInput, McpSourceBindingRef, mcpHeaderSlot, mcpQueryParamSlot, type McpSourceBindingValue, } from "./types";
|
package/dist/sdk/invoke.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface InvokeMcpToolInput {
|
|
|
8
8
|
readonly toolName: string;
|
|
9
9
|
readonly args: unknown;
|
|
10
10
|
readonly sourceData: McpStoredSourceData;
|
|
11
|
+
readonly sourceId: string;
|
|
12
|
+
readonly sourceScope: string;
|
|
11
13
|
/** Innermost executor scope id at invoke time. Mixed into the
|
|
12
14
|
* connection cache key so per-user OAuth/secret resolution doesn't
|
|
13
15
|
* collapse multiple users onto one shared connection. */
|
package/dist/sdk/manifest.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { McpToolAnnotations } from "./types";
|
|
1
2
|
export interface McpToolManifestEntry {
|
|
2
3
|
readonly toolId: string;
|
|
3
4
|
readonly toolName: string;
|
|
4
5
|
readonly description: string | null;
|
|
5
6
|
readonly inputSchema?: unknown;
|
|
6
7
|
readonly outputSchema?: unknown;
|
|
8
|
+
readonly annotations?: McpToolAnnotations;
|
|
7
9
|
}
|
|
8
10
|
export interface McpServerMetadata {
|
|
9
11
|
readonly name: string | null;
|
package/dist/sdk/plugin.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
1
|
+
import { Effect, Layer } from "effect";
|
|
2
|
+
import type { HttpClient } from "effect/unstable/http";
|
|
2
3
|
import { type StorageFailure } from "@executor-js/sdk/core";
|
|
3
4
|
import { type McpBindingStore, type McpStoredSource } from "./binding-store";
|
|
4
5
|
import { McpConnectionError, McpToolDiscoveryError } from "./errors";
|
|
5
|
-
import { type
|
|
6
|
+
import { type McpShapeProbeResult } from "./probe-shape";
|
|
7
|
+
import { McpSourceBindingInput, McpSourceBindingRef, type McpConnectionAuthInput, type McpCredentialInput, type SecretBackedValue } from "./types";
|
|
6
8
|
import { type ConfigFileSink } from "@executor-js/config";
|
|
7
9
|
/**
|
|
8
10
|
* Executor scope id that owns a newly-added MCP source row. Must be one
|
|
@@ -18,10 +20,15 @@ export interface McpRemoteSourceConfig extends McpSourceScopeField {
|
|
|
18
20
|
readonly name: string;
|
|
19
21
|
readonly endpoint: string;
|
|
20
22
|
readonly remoteTransport?: "streamable-http" | "sse" | "auto";
|
|
21
|
-
readonly queryParams?: Record<string,
|
|
22
|
-
readonly headers?: Record<string,
|
|
23
|
+
readonly queryParams?: Record<string, McpCredentialInput>;
|
|
24
|
+
readonly headers?: Record<string, McpCredentialInput>;
|
|
23
25
|
readonly namespace?: string;
|
|
24
|
-
readonly auth?:
|
|
26
|
+
readonly auth?: McpConnectionAuthInput;
|
|
27
|
+
/**
|
|
28
|
+
* Scope that owns any direct credentials supplied on this call. Required
|
|
29
|
+
* whenever headers/queryParams/auth carry direct secret or connection ids.
|
|
30
|
+
*/
|
|
31
|
+
readonly credentialTargetScope?: string;
|
|
25
32
|
}
|
|
26
33
|
export interface McpStdioSourceConfig extends McpSourceScopeField {
|
|
27
34
|
readonly transport: "stdio";
|
|
@@ -36,6 +43,7 @@ export type McpSourceConfig = McpRemoteSourceConfig | McpStdioSourceConfig;
|
|
|
36
43
|
export interface McpProbeResult {
|
|
37
44
|
readonly connected: boolean;
|
|
38
45
|
readonly requiresOAuth: boolean;
|
|
46
|
+
readonly supportsDynamicRegistration: boolean;
|
|
39
47
|
readonly name: string;
|
|
40
48
|
readonly namespace: string;
|
|
41
49
|
readonly toolCount: number | null;
|
|
@@ -44,15 +52,25 @@ export interface McpProbeResult {
|
|
|
44
52
|
export interface McpUpdateSourceInput {
|
|
45
53
|
readonly name?: string;
|
|
46
54
|
readonly endpoint?: string;
|
|
47
|
-
readonly headers?: Record<string,
|
|
48
|
-
readonly queryParams?: Record<string,
|
|
49
|
-
readonly
|
|
55
|
+
readonly headers?: Record<string, McpCredentialInput>;
|
|
56
|
+
readonly queryParams?: Record<string, McpCredentialInput>;
|
|
57
|
+
readonly credentialTargetScope?: string;
|
|
58
|
+
readonly auth?: McpConnectionAuthInput;
|
|
50
59
|
}
|
|
51
60
|
export interface McpProbeEndpointInput {
|
|
52
61
|
readonly endpoint: string;
|
|
53
62
|
readonly headers?: Record<string, SecretBackedValue>;
|
|
54
63
|
readonly queryParams?: Record<string, SecretBackedValue>;
|
|
55
64
|
}
|
|
65
|
+
/** Translate a non-MCP probe outcome into a message a user can act on.
|
|
66
|
+
* The technical `reason` (`401 without Bearer WWW-Authenticate — not an
|
|
67
|
+
* MCP auth challenge`, etc.) stays in telemetry via the probe span; the
|
|
68
|
+
* user gets a sentence pointing at their next step. Exported for tests. */
|
|
69
|
+
export declare const userFacingProbeMessage: (shape: Extract<McpShapeProbeResult, {
|
|
70
|
+
kind: "not-mcp";
|
|
71
|
+
} | {
|
|
72
|
+
kind: "unreachable";
|
|
73
|
+
}>) => string;
|
|
56
74
|
export interface McpPluginOptions {
|
|
57
75
|
/**
|
|
58
76
|
* Allow configuring stdio-transport MCP sources. Off by default.
|
|
@@ -61,11 +79,43 @@ export interface McpPluginOptions {
|
|
|
61
79
|
* `process.env`. Only enable for trusted single-user contexts.
|
|
62
80
|
*/
|
|
63
81
|
readonly dangerouslyAllowStdioMCP?: boolean;
|
|
82
|
+
readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>;
|
|
64
83
|
/** If provided, source add/remove is mirrored to executor.jsonc
|
|
65
84
|
* (best-effort — file errors are logged, not raised). */
|
|
66
85
|
readonly configFile?: ConfigFileSink;
|
|
67
86
|
}
|
|
68
|
-
export declare const mcpPlugin: import("@executor-js/sdk/core").ConfiguredPlugin<"mcp",
|
|
87
|
+
export declare const mcpPlugin: import("@executor-js/sdk/core").ConfiguredPlugin<"mcp", {
|
|
88
|
+
probeEndpoint: (input: string | McpProbeEndpointInput) => Effect.Effect<{
|
|
89
|
+
connected: true;
|
|
90
|
+
requiresOAuth: false;
|
|
91
|
+
supportsDynamicRegistration: false;
|
|
92
|
+
name: string;
|
|
93
|
+
namespace: string;
|
|
94
|
+
toolCount: number;
|
|
95
|
+
serverName: string | null;
|
|
96
|
+
} | {
|
|
97
|
+
connected: false;
|
|
98
|
+
requiresOAuth: true;
|
|
99
|
+
supportsDynamicRegistration: boolean;
|
|
100
|
+
name: string;
|
|
101
|
+
namespace: string;
|
|
102
|
+
toolCount: null;
|
|
103
|
+
serverName: null;
|
|
104
|
+
}, StorageFailure | McpConnectionError, never>;
|
|
105
|
+
addSource: (config: McpSourceConfig) => Effect.Effect<{
|
|
106
|
+
toolCount: number;
|
|
107
|
+
namespace: string;
|
|
108
|
+
}, StorageFailure | McpConnectionError | McpToolDiscoveryError, never>;
|
|
109
|
+
removeSource: (namespace: string, scope: string) => Effect.Effect<void, StorageFailure, never>;
|
|
110
|
+
refreshSource: (namespace: string, scope: string) => Effect.Effect<{
|
|
111
|
+
toolCount: number;
|
|
112
|
+
}, StorageFailure | McpConnectionError | McpToolDiscoveryError, never>;
|
|
113
|
+
getSource: (namespace: string, scope: string) => Effect.Effect<McpStoredSource | null, StorageFailure, never>;
|
|
114
|
+
updateSource: (namespace: string, scope: string, input: McpUpdateSourceInput) => Effect.Effect<void, StorageFailure | McpConnectionError, never>;
|
|
115
|
+
listSourceBindings: (sourceId: string, sourceScope: string) => Effect.Effect<readonly McpSourceBindingRef[], StorageFailure, never>;
|
|
116
|
+
setSourceBinding: (input: McpSourceBindingInput) => Effect.Effect<McpSourceBindingRef, StorageFailure, never>;
|
|
117
|
+
removeSourceBinding: (sourceId: string, sourceScope: string, slot: string, scope: string) => Effect.Effect<void, StorageFailure, never>;
|
|
118
|
+
}, McpBindingStore, McpPluginOptions, {
|
|
69
119
|
readonly mcp_source: {
|
|
70
120
|
readonly fields: {
|
|
71
121
|
readonly id: {
|
|
@@ -85,12 +135,117 @@ export declare const mcpPlugin: import("@executor-js/sdk/core").ConfiguredPlugin
|
|
|
85
135
|
readonly type: "json";
|
|
86
136
|
readonly required: true;
|
|
87
137
|
};
|
|
138
|
+
readonly auth_kind: {
|
|
139
|
+
readonly type: ["none", "header", "oauth2"];
|
|
140
|
+
readonly required: true;
|
|
141
|
+
readonly defaultValue: "none";
|
|
142
|
+
};
|
|
143
|
+
readonly auth_header_name: {
|
|
144
|
+
readonly type: "string";
|
|
145
|
+
readonly required: false;
|
|
146
|
+
};
|
|
147
|
+
readonly auth_header_slot: {
|
|
148
|
+
readonly type: "string";
|
|
149
|
+
readonly required: false;
|
|
150
|
+
};
|
|
151
|
+
readonly auth_header_prefix: {
|
|
152
|
+
readonly type: "string";
|
|
153
|
+
readonly required: false;
|
|
154
|
+
};
|
|
155
|
+
readonly auth_connection_slot: {
|
|
156
|
+
readonly type: "string";
|
|
157
|
+
readonly required: false;
|
|
158
|
+
};
|
|
159
|
+
readonly auth_client_id_slot: {
|
|
160
|
+
readonly type: "string";
|
|
161
|
+
readonly required: false;
|
|
162
|
+
};
|
|
163
|
+
readonly auth_client_secret_slot: {
|
|
164
|
+
readonly type: "string";
|
|
165
|
+
readonly required: false;
|
|
166
|
+
};
|
|
88
167
|
readonly created_at: {
|
|
89
168
|
readonly type: "date";
|
|
90
169
|
readonly required: true;
|
|
91
170
|
};
|
|
92
171
|
};
|
|
93
172
|
};
|
|
173
|
+
readonly mcp_source_header: {
|
|
174
|
+
readonly fields: {
|
|
175
|
+
readonly id: {
|
|
176
|
+
readonly type: "string";
|
|
177
|
+
readonly required: true;
|
|
178
|
+
};
|
|
179
|
+
readonly scope_id: {
|
|
180
|
+
readonly type: "string";
|
|
181
|
+
readonly required: true;
|
|
182
|
+
readonly index: true;
|
|
183
|
+
};
|
|
184
|
+
readonly source_id: {
|
|
185
|
+
readonly type: "string";
|
|
186
|
+
readonly required: true;
|
|
187
|
+
readonly index: true;
|
|
188
|
+
};
|
|
189
|
+
readonly name: {
|
|
190
|
+
readonly type: "string";
|
|
191
|
+
readonly required: true;
|
|
192
|
+
};
|
|
193
|
+
readonly kind: {
|
|
194
|
+
readonly type: ["text", "binding"];
|
|
195
|
+
readonly required: true;
|
|
196
|
+
};
|
|
197
|
+
readonly text_value: {
|
|
198
|
+
readonly type: "string";
|
|
199
|
+
readonly required: false;
|
|
200
|
+
};
|
|
201
|
+
readonly slot_key: {
|
|
202
|
+
readonly type: "string";
|
|
203
|
+
readonly required: false;
|
|
204
|
+
};
|
|
205
|
+
readonly prefix: {
|
|
206
|
+
readonly type: "string";
|
|
207
|
+
readonly required: false;
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
readonly mcp_source_query_param: {
|
|
212
|
+
readonly fields: {
|
|
213
|
+
readonly id: {
|
|
214
|
+
readonly type: "string";
|
|
215
|
+
readonly required: true;
|
|
216
|
+
};
|
|
217
|
+
readonly scope_id: {
|
|
218
|
+
readonly type: "string";
|
|
219
|
+
readonly required: true;
|
|
220
|
+
readonly index: true;
|
|
221
|
+
};
|
|
222
|
+
readonly source_id: {
|
|
223
|
+
readonly type: "string";
|
|
224
|
+
readonly required: true;
|
|
225
|
+
readonly index: true;
|
|
226
|
+
};
|
|
227
|
+
readonly name: {
|
|
228
|
+
readonly type: "string";
|
|
229
|
+
readonly required: true;
|
|
230
|
+
};
|
|
231
|
+
readonly kind: {
|
|
232
|
+
readonly type: ["text", "binding"];
|
|
233
|
+
readonly required: true;
|
|
234
|
+
};
|
|
235
|
+
readonly text_value: {
|
|
236
|
+
readonly type: "string";
|
|
237
|
+
readonly required: false;
|
|
238
|
+
};
|
|
239
|
+
readonly slot_key: {
|
|
240
|
+
readonly type: "string";
|
|
241
|
+
readonly required: false;
|
|
242
|
+
};
|
|
243
|
+
readonly prefix: {
|
|
244
|
+
readonly type: "string";
|
|
245
|
+
readonly required: false;
|
|
246
|
+
};
|
|
247
|
+
};
|
|
248
|
+
};
|
|
94
249
|
readonly mcp_binding: {
|
|
95
250
|
readonly fields: {
|
|
96
251
|
readonly id: {
|
|
@@ -117,7 +272,7 @@ export declare const mcpPlugin: import("@executor-js/sdk/core").ConfiguredPlugin
|
|
|
117
272
|
};
|
|
118
273
|
};
|
|
119
274
|
};
|
|
120
|
-
}>;
|
|
275
|
+
}, undefined, Layer.Layer<unknown, never, never>, import("effect/unstable/httpapi/HttpApiGroup").Any>;
|
|
121
276
|
/**
|
|
122
277
|
* Errors any MCP extension method may surface. The first four are
|
|
123
278
|
* plugin-domain tagged errors that flow directly to clients (4xx, each
|
|
@@ -141,5 +296,8 @@ export interface McpPluginExtension {
|
|
|
141
296
|
}, McpExtensionFailure>;
|
|
142
297
|
readonly getSource: (namespace: string, scope: string) => Effect.Effect<McpStoredSource | null, McpExtensionFailure>;
|
|
143
298
|
readonly updateSource: (namespace: string, scope: string, input: McpUpdateSourceInput) => Effect.Effect<void, McpExtensionFailure>;
|
|
299
|
+
readonly listSourceBindings: (sourceId: string, sourceScope: string) => Effect.Effect<readonly McpSourceBindingRef[], StorageFailure>;
|
|
300
|
+
readonly setSourceBinding: (input: McpSourceBindingInput) => Effect.Effect<McpSourceBindingRef, StorageFailure>;
|
|
301
|
+
readonly removeSourceBinding: (sourceId: string, sourceScope: string, slot: string, scope: string) => Effect.Effect<void, StorageFailure>;
|
|
144
302
|
}
|
|
145
303
|
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,18 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
1
|
+
import { Effect, Layer } from "effect";
|
|
2
|
+
import { HttpClient } from "effect/unstable/http";
|
|
3
|
+
/** Why the probe rejected an endpoint as not-MCP.
|
|
4
|
+
*
|
|
5
|
+
* - `auth-required` — server returned 401. We don't know for sure it's
|
|
6
|
+
* an MCP server (no spec-compliant Bearer challenge or the body
|
|
7
|
+
* isn't JSON-RPC), but the right next step for the user is the same
|
|
8
|
+
* either way: provide credentials and retry. This is what
|
|
9
|
+
* misclassifies real MCP servers like cubic.dev (no
|
|
10
|
+
* resource_metadata) or ref.tools (no WWW-Authenticate at all)
|
|
11
|
+
* without the URL-token fallback at the detect layer.
|
|
12
|
+
* - `wrong-shape` — endpoint responded but with a body or status that
|
|
13
|
+
* doesn't match any MCP shape (200 HTML, 400 GraphQL, 404 from a
|
|
14
|
+
* static host, etc.). User action: this URL probably isn't MCP. */
|
|
15
|
+
export type McpProbeRejectCategory = "auth-required" | "wrong-shape";
|
|
2
16
|
export type McpShapeProbeResult =
|
|
3
17
|
/** Server answered initialize successfully — either a 2xx with a
|
|
4
18
|
* JSON-RPC payload, or a 401 + WWW-Authenticate: Bearer (RFC 6750
|
|
@@ -11,6 +25,7 @@ export type McpShapeProbeResult =
|
|
|
11
25
|
| {
|
|
12
26
|
readonly kind: "not-mcp";
|
|
13
27
|
readonly reason: string;
|
|
28
|
+
readonly category: McpProbeRejectCategory;
|
|
14
29
|
}
|
|
15
30
|
/** Transport-level failure (DNS, TLS, timeout, abort, ...). */
|
|
16
31
|
| {
|
|
@@ -18,10 +33,9 @@ export type McpShapeProbeResult =
|
|
|
18
33
|
readonly reason: string;
|
|
19
34
|
};
|
|
20
35
|
export interface ProbeOptions {
|
|
21
|
-
/** Injected for tests. Defaults to the global `fetch`. */
|
|
22
|
-
readonly fetch?: typeof fetch;
|
|
23
36
|
/** Abort the request after this many ms. Default 8000. */
|
|
24
37
|
readonly timeoutMs?: number;
|
|
38
|
+
readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>;
|
|
25
39
|
readonly headers?: Record<string, string>;
|
|
26
40
|
readonly queryParams?: Record<string, string>;
|
|
27
41
|
}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
2
|
declare const McpStoredSourceSchema_base: Schema.Class<McpStoredSourceSchema, Schema.Struct<{
|
|
3
3
|
readonly namespace: Schema.String;
|
|
4
|
+
readonly scope: Schema.brand<Schema.String, "ScopeId">;
|
|
4
5
|
readonly name: Schema.String;
|
|
5
6
|
readonly config: Schema.Union<readonly [Schema.Struct<{
|
|
6
7
|
readonly transport: Schema.Literal<"remote">;
|
|
7
8
|
readonly endpoint: Schema.String;
|
|
8
9
|
readonly remoteTransport: Schema.withConstructorDefault<Schema.optionalKey<Schema.Literals<readonly ["streamable-http", "sse", "auto"]>>>;
|
|
9
10
|
readonly queryParams: Schema.optional<Schema.$Record<Schema.String, Schema.Union<readonly [Schema.String, Schema.Struct<{
|
|
10
|
-
readonly
|
|
11
|
+
readonly kind: Schema.Literal<"binding">;
|
|
12
|
+
readonly slot: Schema.String;
|
|
11
13
|
readonly prefix: Schema.optional<Schema.String>;
|
|
12
14
|
}>]>>>;
|
|
13
15
|
readonly headers: Schema.optional<Schema.$Record<Schema.String, Schema.Union<readonly [Schema.String, Schema.Struct<{
|
|
14
|
-
readonly
|
|
16
|
+
readonly kind: Schema.Literal<"binding">;
|
|
17
|
+
readonly slot: Schema.String;
|
|
15
18
|
readonly prefix: Schema.optional<Schema.String>;
|
|
16
19
|
}>]>>>;
|
|
17
20
|
readonly auth: Schema.Union<readonly [Schema.Struct<{
|
|
@@ -19,13 +22,13 @@ declare const McpStoredSourceSchema_base: Schema.Class<McpStoredSourceSchema, Sc
|
|
|
19
22
|
}>, Schema.Struct<{
|
|
20
23
|
readonly kind: Schema.Literal<"header">;
|
|
21
24
|
readonly headerName: Schema.String;
|
|
22
|
-
readonly
|
|
25
|
+
readonly secretSlot: Schema.String;
|
|
23
26
|
readonly prefix: Schema.optional<Schema.String>;
|
|
24
27
|
}>, Schema.Struct<{
|
|
25
28
|
readonly kind: Schema.Literal<"oauth2">;
|
|
26
|
-
readonly
|
|
27
|
-
readonly
|
|
28
|
-
readonly
|
|
29
|
+
readonly connectionSlot: Schema.String;
|
|
30
|
+
readonly clientIdSlot: Schema.optional<Schema.String>;
|
|
31
|
+
readonly clientSecretSlot: Schema.optional<Schema.String>;
|
|
29
32
|
}>]>;
|
|
30
33
|
}>, Schema.Struct<{
|
|
31
34
|
readonly transport: Schema.Literal<"stdio">;
|