@apify/actors-mcp-server 0.15.4-beta.3 → 0.15.4-beta.5
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/mcp/remote_tool_call.d.ts +16 -0
- package/dist/mcp/remote_tool_call.d.ts.map +1 -0
- package/dist/mcp/remote_tool_call.js +24 -0
- package/dist/mcp/remote_tool_call.js.map +1 -0
- package/dist/mcp/tool_dispatch.d.ts.map +1 -1
- package/dist/mcp/tool_dispatch.js +63 -69
- package/dist/mcp/tool_dispatch.js.map +1 -1
- package/dist/server_card.d.ts +1 -1
- package/dist/server_card.d.ts.map +1 -1
- package/dist/server_card.js +49 -14
- package/dist/server_card.js.map +1 -1
- package/dist/test_kit/tsconfig.tsbuildinfo +1 -1
- package/dist/tools/actors/call_actor.d.ts.map +1 -1
- package/dist/tools/actors/call_actor.js +34 -47
- package/dist/tools/actors/call_actor.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +51 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
/** Closed outcome union for {@link withRemoteMcpClient}. */
|
|
3
|
+
export type RemoteMcpCallOutcome<T> = {
|
|
4
|
+
outcome: 'connect-failed';
|
|
5
|
+
} | {
|
|
6
|
+
outcome: 'aborted';
|
|
7
|
+
} | {
|
|
8
|
+
outcome: 'error';
|
|
9
|
+
error: unknown;
|
|
10
|
+
} | {
|
|
11
|
+
outcome: 'success';
|
|
12
|
+
value: T;
|
|
13
|
+
};
|
|
14
|
+
/** Connect, run the callback with the live client, always close. */
|
|
15
|
+
export declare function withRemoteMcpClient<T>(serverUrl: string, apifyToken: string, mcpSessionId: string | undefined, signal: AbortSignal, run: (client: Client) => Promise<T>): Promise<RemoteMcpCallOutcome<T>>;
|
|
16
|
+
//# sourceMappingURL=remote_tool_call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote_tool_call.d.ts","sourceRoot":"","sources":["../../src/mcp/remote_tool_call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAIxE,4DAA4D;AAC5D,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAC5B;IAAE,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAC7B;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,GACtB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAEvC,oEAAoE;AACpE,wBAAsB,mBAAmB,CAAC,CAAC,EACvC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAgBlC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { connectMCPClient } from './client.js';
|
|
2
|
+
/** Connect, run the callback with the live client, always close. */
|
|
3
|
+
export async function withRemoteMcpClient(serverUrl, apifyToken, mcpSessionId, signal, run) {
|
|
4
|
+
let client = null;
|
|
5
|
+
try {
|
|
6
|
+
client = await connectMCPClient(serverUrl, apifyToken, mcpSessionId);
|
|
7
|
+
if (!client)
|
|
8
|
+
return { outcome: 'connect-failed' };
|
|
9
|
+
return { outcome: 'success', value: await run(client) };
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (signal.aborted) {
|
|
13
|
+
// Yield a macrotask so the SDK's fire-and-forget notifications/cancelled flushes before close() aborts it.
|
|
14
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
15
|
+
return { outcome: 'aborted' };
|
|
16
|
+
}
|
|
17
|
+
return { outcome: 'error', error };
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
if (client)
|
|
21
|
+
await client.close();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=remote_tool_call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote_tool_call.js","sourceRoot":"","sources":["../../src/mcp/remote_tool_call.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAS/C,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,SAAiB,EACjB,UAAkB,EAClB,YAAgC,EAChC,MAAmB,EACnB,GAAmC;IAEnC,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,CAAC;QACD,MAAM,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,2GAA2G;YAC3G,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;YAAS,CAAC;QACP,IAAI,MAAM;YAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool_dispatch.d.ts","sourceRoot":"","sources":["../../src/mcp/tool_dispatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool_dispatch.d.ts","sourceRoot":"","sources":["../../src/mcp/tool_dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAM7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAOlE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC3C,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3C,eAAe,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;IAC1D,0BAA0B,EAAE,OAAO,CAAC;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,gBAAgB,EAAE,CAAC,YAAY,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,OAAO,EAAE,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,uFAAuF;IACvF,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAGlB,UAAU,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC3E,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,eAAe,EAAE,eAAe,CAAA;CAAE,CAAC,CAwOzG"}
|
|
@@ -9,8 +9,8 @@ import { logHttpError } from '../utils/logging.js';
|
|
|
9
9
|
import { respondErrorNoTelemetry } from '../utils/mcp.js';
|
|
10
10
|
import { applyToolTelemetry, buildExecutionDiagnostics } from '../utils/tool_status.js';
|
|
11
11
|
import { buildActorFields } from '../utils/tools.js';
|
|
12
|
-
import { connectMCPClient } from './client.js';
|
|
13
12
|
import { EXTERNAL_TOOL_CALL_TIMEOUT_MSEC } from './const.js';
|
|
13
|
+
import { withRemoteMcpClient } from './remote_tool_call.js';
|
|
14
14
|
/**
|
|
15
15
|
* Runs a validated tool call through the single tool-type dispatch switch and returns the raw
|
|
16
16
|
* result plus derived telemetry. The exhaustive switch turns a future 4th TOOL_TYPE into a compile
|
|
@@ -32,7 +32,7 @@ import { EXTERNAL_TOOL_CALL_TIMEOUT_MSEC } from './const.js';
|
|
|
32
32
|
* side-channel for ACTOR_MCP connect failures; shells without a transport may pass a no-op.
|
|
33
33
|
*/
|
|
34
34
|
export async function dispatchToolCall(params) {
|
|
35
|
-
var _a, _b
|
|
35
|
+
var _a, _b;
|
|
36
36
|
const { tool, toolArgs, logSafeArgs, apifyToken, apifyClient, mcpSessionId, progressToken, progressTracker, shouldForwardNotifications, signal, sendNotification, emitLog, actorStore, paymentProvider, tools, actorName, actorId, taskMode, logContext, } = params;
|
|
37
37
|
let result = {};
|
|
38
38
|
let toolStatus = TOOL_STATUS.SUCCEEDED;
|
|
@@ -74,40 +74,22 @@ export async function dispatchToolCall(params) {
|
|
|
74
74
|
// means the outer completeTask stores it via the 'completed' path (isError body) —
|
|
75
75
|
// deliberately matching sync's own soft-fail semantics, unlike ACTOR/INTERNAL, whose
|
|
76
76
|
// thrown errors land in the task caller's 'failed' path.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
Please verify the server URL is correct and accessible, and ensure you have a valid Apify token with appropriate permissions.
|
|
84
|
-
`;
|
|
85
|
-
log.softFail(msg, { mcpSessionId, failureCategory: FAILURE_CATEGORY.INTERNAL_ERROR });
|
|
86
|
-
await emitLog({ level: 'error', data: msg });
|
|
87
|
-
toolStatus = TOOL_STATUS.SOFT_FAIL;
|
|
88
|
-
callDiagnostics = { ...callDiagnostics, failure_category: FAILURE_CATEGORY.INTERNAL_ERROR };
|
|
89
|
-
result = respondErrorNoTelemetry(msg);
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
// Only set up notification handlers if progressToken is provided by the client.
|
|
93
|
-
// Gated off for tasks (shouldForwardNotifications=false): the originating request is
|
|
94
|
-
// already answered, so forwarding against its progressToken would misroute.
|
|
95
|
-
if (shouldForwardNotifications && progressToken !== undefined && progressToken !== null) {
|
|
96
|
-
// Set up notification handlers for the client
|
|
77
|
+
// Gated off for tasks (shouldForwardNotifications=false): the originating request is
|
|
78
|
+
// already answered, so forwarding against its progressToken would misroute.
|
|
79
|
+
const shouldForward = shouldForwardNotifications && progressToken !== undefined && progressToken !== null;
|
|
80
|
+
const outcome = await withRemoteMcpClient(tool.serverUrl, apifyToken, mcpSessionId, signal, async (client) => {
|
|
81
|
+
var _a;
|
|
82
|
+
if (shouldForward) {
|
|
97
83
|
for (const schema of ServerNotificationSchema.options) {
|
|
98
84
|
const method = schema.shape.method.value;
|
|
99
85
|
// Forward notifications from the proxy client to the server
|
|
100
86
|
client.setNotificationHandler(schema, async (notification) => {
|
|
101
|
-
log.debug('Sending MCP notification', {
|
|
102
|
-
method,
|
|
103
|
-
mcpSessionId,
|
|
104
|
-
notification,
|
|
105
|
-
});
|
|
87
|
+
log.debug('Sending MCP notification', { method, mcpSessionId, notification });
|
|
106
88
|
await sendNotification(notification);
|
|
107
89
|
});
|
|
108
90
|
}
|
|
109
91
|
}
|
|
110
|
-
log.info(`Calling Actor-MCP${(
|
|
92
|
+
log.info(`Calling Actor-MCP${(_a = logContext === null || logContext === void 0 ? void 0 : logContext.messageSuffix) !== null && _a !== void 0 ? _a : ''}`, {
|
|
111
93
|
...logContext === null || logContext === void 0 ? void 0 : logContext.fields,
|
|
112
94
|
toolName: tool.name,
|
|
113
95
|
actorMcpToolName: tool.originToolName,
|
|
@@ -115,62 +97,74 @@ export async function dispatchToolCall(params) {
|
|
|
115
97
|
mcpSessionId,
|
|
116
98
|
input: logSafeArgs,
|
|
117
99
|
});
|
|
118
|
-
|
|
100
|
+
return client.callTool({
|
|
119
101
|
name: tool.originToolName,
|
|
120
102
|
arguments: toolArgs,
|
|
121
103
|
// Without forwarding there is no route back for remote progress — don't
|
|
122
104
|
// hand the remote a token nobody listens to.
|
|
123
|
-
...(
|
|
124
|
-
}, CallToolResultSchema, {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
105
|
+
...(shouldForward ? { _meta: { progressToken } } : {}),
|
|
106
|
+
}, CallToolResultSchema, { timeout: EXTERNAL_TOOL_CALL_TIMEOUT_MSEC, signal });
|
|
107
|
+
});
|
|
108
|
+
switch (outcome.outcome) {
|
|
109
|
+
case 'connect-failed': {
|
|
110
|
+
const msg = dedent `
|
|
111
|
+
Failed to connect to MCP server at "${tool.serverUrl}".
|
|
112
|
+
Please verify the server URL is correct and accessible, and ensure you have a valid Apify token with appropriate permissions.
|
|
113
|
+
`;
|
|
114
|
+
log.softFail(msg, { mcpSessionId, failureCategory: FAILURE_CATEGORY.INTERNAL_ERROR });
|
|
115
|
+
await emitLog({ level: 'error', data: msg });
|
|
133
116
|
toolStatus = TOOL_STATUS.SOFT_FAIL;
|
|
134
|
-
callDiagnostics = {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
};
|
|
117
|
+
callDiagnostics = { ...callDiagnostics, failure_category: FAILURE_CATEGORY.INTERNAL_ERROR };
|
|
118
|
+
result = respondErrorNoTelemetry(msg);
|
|
119
|
+
break;
|
|
138
120
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
catch (error) {
|
|
142
|
-
if (signal.aborted) {
|
|
143
|
-
// Yield a macrotask first: the SDK sends notifications/cancelled fire-and-forget on
|
|
144
|
-
// the transport's AbortController, which the finally's close() would abort.
|
|
145
|
-
await new Promise((resolve) => setImmediate(resolve));
|
|
146
|
-
// Same as the ACTOR branch below: a cancelled request gets no response, and a
|
|
147
|
-
// cancel is not a failure — so no error body, no failure_* fields, no error log.
|
|
121
|
+
case 'aborted': {
|
|
122
|
+
// Cancel isn't failure: no response body, no failure_* fields, no error log (mirrors ACTOR below).
|
|
148
123
|
toolStatus = TOOL_STATUS.ABORTED;
|
|
149
124
|
result = {};
|
|
150
125
|
break;
|
|
151
126
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
127
|
+
case 'error': {
|
|
128
|
+
({ toolStatus, callDiagnostics } = buildExecutionDiagnostics({
|
|
129
|
+
error: outcome.error,
|
|
130
|
+
isAborted: false,
|
|
131
|
+
actorName,
|
|
132
|
+
actorId,
|
|
133
|
+
}));
|
|
134
|
+
logHttpError(outcome.error, `Failed to call MCP tool '${tool.originToolName}' on Actor '${tool.actorId}'`, {
|
|
135
|
+
actorId: tool.actorId,
|
|
136
|
+
toolName: tool.originToolName,
|
|
137
|
+
failureCategory: callDiagnostics.failure_category,
|
|
138
|
+
});
|
|
139
|
+
result = respondErrorNoTelemetry(`Failed to call MCP tool '${tool.originToolName}' on Actor '${tool.actorId}': ${remoteMcpFailureDetail(outcome.error)}`);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case 'success': {
|
|
143
|
+
// TODO: actor-mcp responses are opaque — isError could be a user input problem
|
|
144
|
+
// (e.g. invalid query) or a genuine server failure. We can't distinguish without
|
|
145
|
+
// parsing the error text. Defaulting to INTERNAL_ERROR for now; revisit when
|
|
146
|
+
// actor-mcp gets deeper telemetry treatment.
|
|
147
|
+
if ('isError' in outcome.value && outcome.value.isError) {
|
|
148
|
+
toolStatus = TOOL_STATUS.SOFT_FAIL;
|
|
149
|
+
callDiagnostics = {
|
|
150
|
+
failure_category: FAILURE_CATEGORY.INTERNAL_ERROR,
|
|
151
|
+
...buildActorFields(actorName, actorId),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
result = { ...outcome.value };
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
default:
|
|
158
|
+
// Exhaustiveness guard mirroring the outer TOOL_TYPE switch: a new outcome
|
|
159
|
+
// variant makes `outcome` non-`never` here and fails `satisfies never` at
|
|
160
|
+
// compile time. Unreachable at runtime — RemoteMcpCallOutcome is a closed union.
|
|
161
|
+
throw new Error(`Unknown outcome "${outcome.outcome}"`);
|
|
168
162
|
}
|
|
169
163
|
break;
|
|
170
164
|
}
|
|
171
165
|
case TOOL_TYPE.ACTOR: {
|
|
172
166
|
try {
|
|
173
|
-
log.info(`Calling Actor${(
|
|
167
|
+
log.info(`Calling Actor${(_b = logContext === null || logContext === void 0 ? void 0 : logContext.messageSuffix) !== null && _b !== void 0 ? _b : ''}`, {
|
|
174
168
|
...logContext === null || logContext === void 0 ? void 0 : logContext.fields,
|
|
175
169
|
toolName: tool.name,
|
|
176
170
|
actorName: tool.actorFullName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool_dispatch.js","sourceRoot":"","sources":["../../src/mcp/tool_dispatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool_dispatch.js","sourceRoot":"","sources":["../../src/mcp/tool_dispatch.ts"],"names":[],"mappings":"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"}
|
package/dist/server_card.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ import type { Implementation } from '@modelcontextprotocol/sdk/types.js';
|
|
|
2
2
|
import type { ServerCard } from './types.js';
|
|
3
3
|
/** Returns the `serverInfo` (MCP `Implementation`) advertised in the initialize response. */
|
|
4
4
|
export declare function getServerInfo(): Implementation;
|
|
5
|
-
/** Returns the MCP server card object
|
|
5
|
+
/** Returns the MCP server card object. See {@link ServerCard} for why it is a hybrid shape. */
|
|
6
6
|
export declare function getServerCard(): ServerCard;
|
|
7
7
|
//# sourceMappingURL=server_card.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server_card.d.ts","sourceRoot":"","sources":["../src/server_card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"server_card.d.ts","sourceRoot":"","sources":["../src/server_card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAYzE,OAAO,KAAK,EAAE,UAAU,EAA0D,MAAM,YAAY,CAAC;AAgCrG,6FAA6F;AAC7F,wBAAgB,aAAa,IAAI,cAAc,CAS9C;AAkBD,+FAA+F;AAC/F,wBAAgB,aAAa,IAAI,UAAU,CAoC1C"}
|
package/dist/server_card.js
CHANGED
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
import { LATEST_PROTOCOL_VERSION } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import { APIFY_DOCS_MCP_URL, APIFY_FAVICON_URL, APIFY_LOGO_URL, APIFY_MCP_URL, SERVER_NAME, SERVER_TITLE, } from './const.js';
|
|
2
|
+
import { APIFY_DOCS_MCP_URL, APIFY_FAVICON_URL, APIFY_LOGO_URL, APIFY_MCP_URL, HELPER_TOOLS, SERVER_NAME, SERVER_TITLE, } from './const.js';
|
|
3
|
+
import { SERVER_MODE } from './types.js';
|
|
3
4
|
import { readJsonFile } from './utils/generic.js';
|
|
5
|
+
import { getToolsForServerMode } from './utils/tools_loader.js';
|
|
4
6
|
import { getPackageVersion } from './utils/version.js';
|
|
7
|
+
/**
|
|
8
|
+
* The registry-shaped half of the server card lives in `server.json`, which is already the
|
|
9
|
+
* source of truth for registry publishing and is version-bumped by the release workflow.
|
|
10
|
+
* Reading it here keeps the card from drifting out of sync with what we publish.
|
|
11
|
+
*/
|
|
5
12
|
const serverJson = readJsonFile(import.meta.url, '../server.json');
|
|
13
|
+
/**
|
|
14
|
+
* Server icon, shared by the initialize response and the server card so the two cannot diverge.
|
|
15
|
+
* PNG rather than the `.ico` favicon: the registry schema restricts `icons[].mimeType` to
|
|
16
|
+
* png/jpeg/jpg/svg+xml/webp.
|
|
17
|
+
*/
|
|
18
|
+
const SERVER_ICONS = [
|
|
19
|
+
{
|
|
20
|
+
src: APIFY_LOGO_URL,
|
|
21
|
+
mimeType: 'image/png',
|
|
22
|
+
sizes: ['180x180'],
|
|
23
|
+
},
|
|
24
|
+
];
|
|
6
25
|
/** Returns the `serverInfo` (MCP `Implementation`) advertised in the initialize response. */
|
|
7
26
|
export function getServerInfo() {
|
|
8
27
|
return {
|
|
@@ -10,28 +29,44 @@ export function getServerInfo() {
|
|
|
10
29
|
title: SERVER_TITLE,
|
|
11
30
|
version: getPackageVersion(),
|
|
12
31
|
description: serverJson.description,
|
|
13
|
-
websiteUrl:
|
|
14
|
-
icons: [
|
|
15
|
-
{
|
|
16
|
-
src: APIFY_LOGO_URL,
|
|
17
|
-
mimeType: 'image/png',
|
|
18
|
-
sizes: ['180x180'],
|
|
19
|
-
},
|
|
20
|
-
],
|
|
32
|
+
websiteUrl: APIFY_DOCS_MCP_URL,
|
|
33
|
+
icons: [...SERVER_ICONS],
|
|
21
34
|
};
|
|
22
35
|
}
|
|
23
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Summarises the tools a default session serves. `getDefaultTools()` under-reports — it omits
|
|
38
|
+
* what `call-actor` pulls in — and `report-problem` is client-gated at serve time, so a static
|
|
39
|
+
* card cannot carry it. Each tool's plain `description` is by contract the session-less render.
|
|
40
|
+
*/
|
|
41
|
+
function getServerCardTools() {
|
|
42
|
+
return getToolsForServerMode({}, [], SERVER_MODE.DEFAULT)
|
|
43
|
+
.filter((tool) => tool.name !== HELPER_TOOLS.PROBLEM_REPORT)
|
|
44
|
+
.map((tool) => ({
|
|
45
|
+
name: tool.name,
|
|
46
|
+
title: tool.title,
|
|
47
|
+
description: tool.description,
|
|
48
|
+
annotations: tool.annotations,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
/** Returns the MCP server card object. See {@link ServerCard} for why it is a hybrid shape. */
|
|
24
52
|
export function getServerCard() {
|
|
25
53
|
return {
|
|
26
|
-
$schema:
|
|
27
|
-
|
|
54
|
+
$schema: serverJson.$schema,
|
|
55
|
+
name: serverJson.name,
|
|
56
|
+
title: SERVER_TITLE,
|
|
57
|
+
description: serverJson.description,
|
|
58
|
+
version: getPackageVersion(),
|
|
59
|
+
websiteUrl: APIFY_DOCS_MCP_URL,
|
|
60
|
+
repository: serverJson.repository,
|
|
61
|
+
icons: [...SERVER_ICONS],
|
|
62
|
+
remotes: serverJson.remotes,
|
|
63
|
+
serverUrl: APIFY_MCP_URL,
|
|
28
64
|
protocolVersion: LATEST_PROTOCOL_VERSION,
|
|
29
65
|
serverInfo: {
|
|
30
66
|
name: SERVER_NAME,
|
|
31
67
|
title: SERVER_TITLE,
|
|
32
68
|
version: getPackageVersion(),
|
|
33
69
|
},
|
|
34
|
-
description: serverJson.description,
|
|
35
70
|
iconUrl: APIFY_FAVICON_URL,
|
|
36
71
|
documentationUrl: APIFY_DOCS_MCP_URL,
|
|
37
72
|
transport: {
|
|
@@ -45,7 +80,7 @@ export function getServerCard() {
|
|
|
45
80
|
required: true,
|
|
46
81
|
schemes: ['bearer', 'oauth2'],
|
|
47
82
|
},
|
|
48
|
-
tools:
|
|
83
|
+
tools: getServerCardTools(),
|
|
49
84
|
};
|
|
50
85
|
}
|
|
51
86
|
//# sourceMappingURL=server_card.js.map
|
package/dist/server_card.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server_card.js","sourceRoot":"","sources":["../src/server_card.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,EACH,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,UAAU,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"server_card.js","sourceRoot":"","sources":["../src/server_card.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,EACH,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,GAAG,YAAY,CAM5B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;AAEtC;;;;GAIG;AACH,MAAM,YAAY,GAAwB;IACtC;QACI,GAAG,EAAE,cAAc;QACnB,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,CAAC,SAAS,CAAC;KACrB;CACJ,CAAC;AAEF,6FAA6F;AAC7F,MAAM,UAAU,aAAa;IACzB,OAAO;QACH,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,iBAAiB,EAAG;QAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,UAAU,EAAE,kBAAkB;QAC9B,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC;KAC3B,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB;IACvB,OAAO,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC;SACpD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,cAAc,CAAC;SAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACZ,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;KAChC,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,aAAa;IACzB,OAAO;QACH,OAAO,EAAE,UAAU,CAAC,OAAO;QAE3B,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,OAAO,EAAE,iBAAiB,EAAG;QAC7B,UAAU,EAAE,kBAAkB;QAC9B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC;QACxB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,SAAS,EAAE,aAAa;QAExB,eAAe,EAAE,uBAAuB;QACxC,UAAU,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,iBAAiB,EAAG;SAChC;QACD,OAAO,EAAE,iBAAiB;QAC1B,gBAAgB,EAAE,kBAAkB;QACpC,SAAS,EAAE;YACP,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,GAAG;SAChB;QACD,YAAY,EAAE;YACV,KAAK,EAAE,EAAE;SACZ;QACD,cAAc,EAAE;YACZ,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;SAChC;QAED,KAAK,EAAE,kBAAkB,EAAE;KAC9B,CAAC;AACN,CAAC"}
|