@relaycast/mcp 0.2.3 → 0.2.4
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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +45 -12
- package/dist/server.js.map +1 -1
- package/dist/smithery.d.ts +55 -0
- package/dist/smithery.d.ts.map +1 -0
- package/dist/smithery.js +34 -0
- package/dist/smithery.js.map +1 -0
- package/dist/tools/channels.d.ts.map +1 -1
- package/dist/tools/channels.js +65 -30
- package/dist/tools/channels.js.map +1 -1
- package/dist/tools/features.d.ts.map +1 -1
- package/dist/tools/features.js +73 -27
- package/dist/tools/features.js.map +1 -1
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +67 -30
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/programmability.d.ts.map +1 -1
- package/dist/tools/programmability.js +124 -50
- package/dist/tools/programmability.js.map +1 -1
- package/dist/tools/registration.d.ts.map +1 -1
- package/dist/tools/registration.js +28 -18
- package/dist/tools/registration.js.map +1 -1
- package/dist/transports.d.ts +11 -1
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +9 -3
- package/dist/transports.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
const DEFAULT_BASE_URL = 'https://api.relaycast.dev';
|
|
3
|
+
/** Passthrough object schema for dynamic API responses. */
|
|
4
|
+
const jsonResult = z.object({}).passthrough();
|
|
3
5
|
function normalizeBaseUrl(baseUrl) {
|
|
4
6
|
return (baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, '');
|
|
5
7
|
}
|
|
@@ -27,10 +29,11 @@ export function registerRegistrationTools(server, getRelay, getSession, setSessi
|
|
|
27
29
|
// Tool 1: create_workspace
|
|
28
30
|
server.registerTool('create_workspace', {
|
|
29
31
|
title: 'Create Workspace',
|
|
30
|
-
description: 'Create a new workspace and store its
|
|
32
|
+
description: 'Create a new Relaycast workspace and automatically store its API key in this MCP session. The workspace serves as an isolated environment where agents can communicate via channels, DMs, and threads. After creation, the workspace key is ready for immediate use with register and other workspace-level tools.',
|
|
31
33
|
inputSchema: {
|
|
32
|
-
name: z.string().describe('
|
|
34
|
+
name: z.string().describe('Human-readable workspace name, used to identify the workspace in dashboards and logs'),
|
|
33
35
|
},
|
|
36
|
+
outputSchema: jsonResult,
|
|
34
37
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
35
38
|
}, async ({ name }) => {
|
|
36
39
|
const workspace = await createWorkspace(name, baseUrl);
|
|
@@ -42,14 +45,18 @@ export function registerRegistrationTools(server, getRelay, getSession, setSessi
|
|
|
42
45
|
setSession({ workspaceKey, agentToken: null, agentName: null });
|
|
43
46
|
return {
|
|
44
47
|
content: [{ type: 'text', text: JSON.stringify(workspace, null, 2) }],
|
|
48
|
+
structuredContent: workspace,
|
|
45
49
|
};
|
|
46
50
|
});
|
|
47
51
|
// Tool 2: set_workspace_key
|
|
48
52
|
server.registerTool('set_workspace_key', {
|
|
49
53
|
title: 'Set Workspace Key',
|
|
50
|
-
description: '
|
|
54
|
+
description: 'Authenticate this MCP session by providing an existing workspace API key (rk_live_...). This enables all workspace-level tools including agent registration, channel management, and messaging. If the key belongs to a different workspace than the current session, the previous agent identity is cleared and you must re-register.',
|
|
51
55
|
inputSchema: {
|
|
52
|
-
api_key: z.string().describe('Workspace API key
|
|
56
|
+
api_key: z.string().describe('Workspace API key starting with "rk_live_", obtained from workspace creation or the Relaycast dashboard'),
|
|
57
|
+
},
|
|
58
|
+
outputSchema: {
|
|
59
|
+
message: z.string().describe('Confirmation message indicating whether the workspace key was set successfully'),
|
|
53
60
|
},
|
|
54
61
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
55
62
|
}, async ({ api_key }) => {
|
|
@@ -65,26 +72,24 @@ export function registerRegistrationTools(server, getRelay, getSession, setSessi
|
|
|
65
72
|
else {
|
|
66
73
|
setSession({ workspaceKey: api_key });
|
|
67
74
|
}
|
|
75
|
+
const message = switchingWorkspace
|
|
76
|
+
? 'Workspace key set. Previous agent session was cleared; call "register" again.'
|
|
77
|
+
: 'Workspace key set.';
|
|
68
78
|
return {
|
|
69
|
-
content: [
|
|
70
|
-
|
|
71
|
-
type: 'text',
|
|
72
|
-
text: switchingWorkspace
|
|
73
|
-
? 'Workspace key set. Previous agent session was cleared; call "register" again.'
|
|
74
|
-
: 'Workspace key set.',
|
|
75
|
-
},
|
|
76
|
-
],
|
|
79
|
+
content: [{ type: 'text', text: message }],
|
|
80
|
+
structuredContent: { message },
|
|
77
81
|
};
|
|
78
82
|
});
|
|
79
83
|
// Tool 3: register
|
|
80
84
|
server.registerTool('register', {
|
|
81
85
|
title: 'Register Agent',
|
|
82
|
-
description: 'Register
|
|
86
|
+
description: 'Register an agent identity in the current workspace and obtain an agent token for all subsequent operations. The agent name must be unique within the workspace. Once registered, the agent can send messages, join channels, react to messages, and perform all other agent-level actions. Re-registering with the same name returns the existing token.',
|
|
83
87
|
inputSchema: {
|
|
84
|
-
name: z.string().describe('Unique agent name'),
|
|
85
|
-
type: z.enum(['agent', 'human']).optional().describe('
|
|
86
|
-
persona: z.string().optional().describe('
|
|
88
|
+
name: z.string().describe('Unique agent name within the workspace, used as the display name in messages and mentions'),
|
|
89
|
+
type: z.enum(['agent', 'human']).optional().describe('Whether this identity represents an AI agent or a human user'),
|
|
90
|
+
persona: z.string().optional().describe('Free-text persona description that other agents can read to understand this agent\'s role and capabilities'),
|
|
87
91
|
},
|
|
92
|
+
outputSchema: jsonResult,
|
|
88
93
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
89
94
|
}, async ({ name, type, persona }) => {
|
|
90
95
|
requireWorkspaceKey(getSession());
|
|
@@ -94,17 +99,21 @@ export function registerRegistrationTools(server, getRelay, getSession, setSessi
|
|
|
94
99
|
setSession({ agentToken: result.token, agentName: name });
|
|
95
100
|
return {
|
|
96
101
|
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
102
|
+
structuredContent: result,
|
|
97
103
|
};
|
|
98
104
|
});
|
|
99
105
|
// Tool 4: list_agents
|
|
100
106
|
server.registerTool('list_agents', {
|
|
101
107
|
title: 'List Agents',
|
|
102
|
-
description: '
|
|
108
|
+
description: 'Retrieve all agents registered in the current workspace. Returns each agent\'s name, type, persona, and online/offline status. Use the optional status filter to find only agents that are currently connected or disconnected.',
|
|
103
109
|
inputSchema: {
|
|
104
110
|
status: z
|
|
105
111
|
.enum(['online', 'offline'])
|
|
106
112
|
.optional()
|
|
107
|
-
.describe('Filter by
|
|
113
|
+
.describe('Filter agents by connection status: "online" for currently connected agents, "offline" for disconnected ones'),
|
|
114
|
+
},
|
|
115
|
+
outputSchema: {
|
|
116
|
+
agents: z.array(z.object({}).passthrough()).describe('Array of registered agent objects with name, type, persona, and status'),
|
|
108
117
|
},
|
|
109
118
|
annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true },
|
|
110
119
|
}, async ({ status }) => {
|
|
@@ -113,6 +122,7 @@ export function registerRegistrationTools(server, getRelay, getSession, setSessi
|
|
|
113
122
|
const agents = await relay.agents.list(status ? { status } : undefined);
|
|
114
123
|
return {
|
|
115
124
|
content: [{ type: 'text', text: JSON.stringify(agents, null, 2) }],
|
|
125
|
+
structuredContent: { agents: agents },
|
|
116
126
|
};
|
|
117
127
|
});
|
|
118
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/tools/registration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAErD,SAAS,gBAAgB,CAAC,OAAgB;IACxC,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,IAAY,EACZ,OAAgB;IAEhB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE;QACzE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4C,CAAC;IACnF,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,4BAA4B,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAqB;IAChD,IAAI,OAAO,CAAC,YAAY;QAAE,OAAO;IACjC,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAAiB,EACjB,QAAqB,EACrB,UAA8B,EAC9B,UAAkD,EAClD,OAAgB;IAEhB,2BAA2B;IAC3B,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/tools/registration.ts"],"names":[],"mappings":"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"}
|
package/dist/transports.d.ts
CHANGED
|
@@ -4,11 +4,21 @@ import { type McpServerOptions } from './server.js';
|
|
|
4
4
|
* Reads from stdin, writes to stdout.
|
|
5
5
|
*/
|
|
6
6
|
export declare function startStdio(options: McpServerOptions): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Lifecycle callbacks for session events, used for external session
|
|
9
|
+
* registries (e.g. Redis) to support multi-machine deployments.
|
|
10
|
+
*/
|
|
11
|
+
export interface SessionLifecycle {
|
|
12
|
+
onCreated?: (sessionId: string) => void;
|
|
13
|
+
onClosed?: (sessionId: string) => void;
|
|
14
|
+
}
|
|
7
15
|
/**
|
|
8
16
|
* Create Express middleware for HTTP+SSE transport (multi-agent).
|
|
9
17
|
* Each connecting client gets its own session with isolated state and telemetry.
|
|
10
18
|
*/
|
|
11
|
-
export declare function createHttpHandler(baseOptions: McpServerOptions): {
|
|
19
|
+
export declare function createHttpHandler(baseOptions: McpServerOptions, lifecycle?: SessionLifecycle): {
|
|
20
|
+
/** Check whether a session ID is owned by this process. */
|
|
21
|
+
hasSession: (sessionId: string) => boolean;
|
|
12
22
|
handleRequest: (req: import("node:http").IncomingMessage, res: import("node:http").ServerResponse) => Promise<void>;
|
|
13
23
|
};
|
|
14
24
|
//# sourceMappingURL=transports.d.ts.map
|
package/dist/transports.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transports.d.ts","sourceRoot":"","sources":["../src/transports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqC,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIvF;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"transports.d.ts","sourceRoot":"","sources":["../src/transports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqC,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIvF;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,gBAAgB;IAEzF,2DAA2D;4BACnC,MAAM;yBAGvB,OAAO,WAAW,EAAE,eAAe,OACnC,OAAO,WAAW,EAAE,cAAc;EAgD5C"}
|
package/dist/transports.js
CHANGED
|
@@ -21,8 +21,10 @@ const sessions = new Map();
|
|
|
21
21
|
* Create Express middleware for HTTP+SSE transport (multi-agent).
|
|
22
22
|
* Each connecting client gets its own session with isolated state and telemetry.
|
|
23
23
|
*/
|
|
24
|
-
export function createHttpHandler(baseOptions) {
|
|
24
|
+
export function createHttpHandler(baseOptions, lifecycle) {
|
|
25
25
|
return {
|
|
26
|
+
/** Check whether a session ID is owned by this process. */
|
|
27
|
+
hasSession: (sessionId) => sessions.has(sessionId),
|
|
26
28
|
handleRequest: async (req, res) => {
|
|
27
29
|
// Check for existing session
|
|
28
30
|
const sessionId = req.headers['mcp-session-id'];
|
|
@@ -44,18 +46,22 @@ export function createHttpHandler(baseOptions) {
|
|
|
44
46
|
transport.onclose = () => {
|
|
45
47
|
if (transport.sessionId) {
|
|
46
48
|
sessions.delete(transport.sessionId);
|
|
49
|
+
lifecycle?.onClosed?.(transport.sessionId);
|
|
47
50
|
}
|
|
48
51
|
};
|
|
49
52
|
await mcpServer.connect(transport);
|
|
50
|
-
|
|
53
|
+
// handleRequest must run first — the session ID is generated during
|
|
54
|
+
// the initialize handshake, not during connect().
|
|
55
|
+
await transport.handleRequest(req, res);
|
|
56
|
+
if (transport.sessionId && !sessions.has(transport.sessionId)) {
|
|
51
57
|
sessions.set(transport.sessionId, { transport });
|
|
58
|
+
lifecycle?.onCreated?.(transport.sessionId);
|
|
52
59
|
telemetry.capture('relaycast_mcp_http_session_started', {
|
|
53
60
|
source_surface: 'mcp',
|
|
54
61
|
transport: 'http',
|
|
55
62
|
mcp_transport_session_id: transport.sessionId,
|
|
56
63
|
});
|
|
57
64
|
}
|
|
58
|
-
await transport.handleRequest(req, res);
|
|
59
65
|
},
|
|
60
66
|
};
|
|
61
67
|
}
|
package/dist/transports.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transports.js","sourceRoot":"","sources":["../src/transports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAyB;IACxD,MAAM,SAAS,GAAG,oBAAoB,CAAC,EAAE,GAAG,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;
|
|
1
|
+
{"version":3,"file":"transports.js","sourceRoot":"","sources":["../src/transports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAyB;IACxD,MAAM,SAAS,GAAG,oBAAoB,CAAC,EAAE,GAAG,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAWD;;;GAGG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwD,CAAC;AAEjF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAA6B,EAAE,SAA4B;IAC3F,OAAO;QACL,2DAA2D;QAC3D,UAAU,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;QAE1D,aAAa,EAAE,KAAK,EAClB,GAAwC,EACxC,GAAuC,EACvC,EAAE;YACF,6BAA6B;YAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;YAEtE,IAAI,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;gBACzC,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,gEAAgE;YAChE,MAAM,SAAS,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAElD,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;aACvC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,oBAAoB,CAAC;gBACrC,GAAG,WAAW;gBACd,kBAAkB,EAAE,MAAM;gBAC1B,SAAS;aACV,CAAC,CAAC;YAEH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACvB,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;oBACxB,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;oBACrC,SAAS,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEnC,oEAAoE;YACpE,kDAAkD;YAClD,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAExC,IAAI,SAAS,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9D,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBACjD,SAAS,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC5C,SAAS,CAAC,OAAO,CAAC,oCAAoC,EAAE;oBACtD,cAAc,EAAE,KAAK;oBACrB,SAAS,EAAE,MAAM;oBACjB,wBAAwB,EAAE,SAAS,CAAC,SAAS;iBAC9C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export interface SessionState {
|
|
|
6
6
|
agentName: string | null;
|
|
7
7
|
wsBridge: WsBridge | null;
|
|
8
8
|
subscriptions: SubscriptionManager | null;
|
|
9
|
+
wsInitAttempted: boolean;
|
|
9
10
|
}
|
|
10
11
|
export declare function createInitialSession(workspaceKey?: string | null): SessionState;
|
|
11
12
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,CAAC,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,YAAY,CASrF"}
|
package/dist/types.js
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
export function createInitialSession(workspaceKey = null) {
|
|
2
|
-
return {
|
|
2
|
+
return {
|
|
3
|
+
workspaceKey,
|
|
4
|
+
agentToken: null,
|
|
5
|
+
agentName: null,
|
|
6
|
+
wsBridge: null,
|
|
7
|
+
subscriptions: null,
|
|
8
|
+
wsInitAttempted: false,
|
|
9
|
+
};
|
|
3
10
|
}
|
|
4
11
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,oBAAoB,CAAC,eAA8B,IAAI;IACrE,OAAO;QACL,YAAY;QACZ,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,KAAK;KACvB,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relaycast/mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
"lint": "eslint src/"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@relaycast/sdk": "0.2.
|
|
17
|
-
"@relaycast/types": "0.2.
|
|
16
|
+
"@relaycast/sdk": "0.2.4",
|
|
17
|
+
"@relaycast/types": "0.2.4",
|
|
18
18
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
19
19
|
"express": "^5.2.1",
|
|
20
20
|
"zod": "^4.3.6"
|