@relaycast/mcp 0.1.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.
Files changed (65) hide show
  1. package/dist/__tests__/index.test.d.ts +2 -0
  2. package/dist/__tests__/index.test.d.ts.map +1 -0
  3. package/dist/__tests__/index.test.js +8 -0
  4. package/dist/__tests__/index.test.js.map +1 -0
  5. package/dist/index.d.ts +7 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +5 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/piggyback.d.ts +5 -0
  10. package/dist/piggyback.d.ts.map +1 -0
  11. package/dist/piggyback.js +55 -0
  12. package/dist/piggyback.js.map +1 -0
  13. package/dist/prompts.d.ts +5 -0
  14. package/dist/prompts.d.ts.map +1 -0
  15. package/dist/prompts.js +39 -0
  16. package/dist/prompts.js.map +1 -0
  17. package/dist/resources/definitions.d.ts +4 -0
  18. package/dist/resources/definitions.d.ts.map +1 -0
  19. package/dist/resources/definitions.js +40 -0
  20. package/dist/resources/definitions.js.map +1 -0
  21. package/dist/resources/index.d.ts +5 -0
  22. package/dist/resources/index.d.ts.map +1 -0
  23. package/dist/resources/index.js +4 -0
  24. package/dist/resources/index.js.map +1 -0
  25. package/dist/resources/subscriptions.d.ts +18 -0
  26. package/dist/resources/subscriptions.d.ts.map +1 -0
  27. package/dist/resources/subscriptions.js +30 -0
  28. package/dist/resources/subscriptions.js.map +1 -0
  29. package/dist/resources/ws-bridge.d.ts +29 -0
  30. package/dist/resources/ws-bridge.d.ts.map +1 -0
  31. package/dist/resources/ws-bridge.js +77 -0
  32. package/dist/resources/ws-bridge.js.map +1 -0
  33. package/dist/server.d.ts +7 -0
  34. package/dist/server.d.ts.map +1 -0
  35. package/dist/server.js +66 -0
  36. package/dist/server.js.map +1 -0
  37. package/dist/tools/channels.d.ts +4 -0
  38. package/dist/tools/channels.d.ts.map +1 -0
  39. package/dist/tools/channels.js +86 -0
  40. package/dist/tools/channels.js.map +1 -0
  41. package/dist/tools/features.d.ts +4 -0
  42. package/dist/tools/features.d.ts.map +1 -0
  43. package/dist/tools/features.js +78 -0
  44. package/dist/tools/features.js.map +1 -0
  45. package/dist/tools/messaging.d.ts +4 -0
  46. package/dist/tools/messaging.d.ts.map +1 -0
  47. package/dist/tools/messaging.js +81 -0
  48. package/dist/tools/messaging.js.map +1 -0
  49. package/dist/tools/programmability.d.ts +4 -0
  50. package/dist/tools/programmability.d.ts.map +1 -0
  51. package/dist/tools/programmability.js +150 -0
  52. package/dist/tools/programmability.js.map +1 -0
  53. package/dist/tools/registration.d.ts +5 -0
  54. package/dist/tools/registration.d.ts.map +1 -0
  55. package/dist/tools/registration.js +37 -0
  56. package/dist/tools/registration.js.map +1 -0
  57. package/dist/transports.d.ts +14 -0
  58. package/dist/transports.d.ts.map +1 -0
  59. package/dist/transports.js +51 -0
  60. package/dist/transports.js.map +1 -0
  61. package/dist/types.d.ts +10 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +4 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +25 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/tools/features.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,MAAM,WAAW,GAChC,IAAI,CAiFN"}
@@ -0,0 +1,78 @@
1
+ import { z } from 'zod';
2
+ export function registerFeatureTools(server, getAgentClient) {
3
+ server.registerTool('add_reaction', {
4
+ description: 'Add an emoji reaction to a message.',
5
+ inputSchema: {
6
+ message_id: z.string().describe('Message ID'),
7
+ emoji: z.string().describe('Emoji to react with'),
8
+ },
9
+ }, async ({ message_id, emoji }) => {
10
+ const client = getAgentClient();
11
+ await client.react(message_id, emoji);
12
+ return { content: [{ type: 'text', text: `Reacted with ${emoji}` }] };
13
+ });
14
+ server.registerTool('remove_reaction', {
15
+ description: 'Remove an emoji reaction from a message.',
16
+ inputSchema: {
17
+ message_id: z.string().describe('Message ID'),
18
+ emoji: z.string().describe('Emoji to remove'),
19
+ },
20
+ }, async ({ message_id, emoji }) => {
21
+ const client = getAgentClient();
22
+ await client.unreact(message_id, emoji);
23
+ return { content: [{ type: 'text', text: `Removed reaction ${emoji}` }] };
24
+ });
25
+ server.registerTool('search_messages', {
26
+ description: 'Search messages across channels.',
27
+ inputSchema: {
28
+ query: z.string().describe('Search query'),
29
+ channel: z.string().optional().describe('Limit to channel'),
30
+ from: z.string().optional().describe('Filter by sender agent'),
31
+ limit: z.number().optional().describe('Max results'),
32
+ },
33
+ }, async ({ query, channel, from, limit }) => {
34
+ const client = getAgentClient();
35
+ const results = await client.search(query, { channel, from, limit });
36
+ return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
37
+ });
38
+ server.registerTool('check_inbox', {
39
+ description: 'Check inbox for unread messages, mentions, and DMs.',
40
+ }, async () => {
41
+ const client = getAgentClient();
42
+ const inbox = await client.inbox();
43
+ return { content: [{ type: 'text', text: JSON.stringify(inbox, null, 2) }] };
44
+ });
45
+ server.registerTool('mark_read', {
46
+ description: 'Mark a message as read.',
47
+ inputSchema: {
48
+ message_id: z.string().describe('Message ID to mark as read'),
49
+ },
50
+ }, async ({ message_id }) => {
51
+ const client = getAgentClient();
52
+ await client.markRead(message_id);
53
+ return { content: [{ type: 'text', text: `Marked message ${message_id} as read` }] };
54
+ });
55
+ server.registerTool('get_readers', {
56
+ description: 'Get list of agents who have read a message.',
57
+ inputSchema: {
58
+ message_id: z.string().describe('Message ID'),
59
+ },
60
+ }, async ({ message_id }) => {
61
+ const client = getAgentClient();
62
+ const readers = await client.readers(message_id);
63
+ return { content: [{ type: 'text', text: JSON.stringify(readers, null, 2) }] };
64
+ });
65
+ server.registerTool('upload_file', {
66
+ description: 'Upload a file and get an attachment ID.',
67
+ inputSchema: {
68
+ filename: z.string().describe('File name'),
69
+ content_type: z.string().describe('MIME type (e.g. text/plain, image/png)'),
70
+ size: z.number().describe('File size in bytes'),
71
+ },
72
+ }, async ({ filename, content_type, size }) => {
73
+ const client = getAgentClient();
74
+ const upload = await client.files.upload({ filename, content_type, size });
75
+ return { content: [{ type: 'text', text: JSON.stringify(upload, null, 2) }] };
76
+ });
77
+ }
78
+ //# sourceMappingURL=features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/tools/features.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AgentClient } from '@relaycast/sdk';
3
+ export declare function registerMessagingTools(server: McpServer, getAgentClient: () => AgentClient): void;
4
+ //# sourceMappingURL=messaging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/tools/messaging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,MAAM,WAAW,GAChC,IAAI,CAoFN"}
@@ -0,0 +1,81 @@
1
+ import { z } from 'zod';
2
+ export function registerMessagingTools(server, getAgentClient) {
3
+ server.registerTool('post_message', {
4
+ description: 'Post a message to a channel.',
5
+ inputSchema: {
6
+ channel: z.string().describe('Channel name'),
7
+ text: z.string().describe('Message text'),
8
+ attachments: z.array(z.string()).optional().describe('File IDs to attach'),
9
+ },
10
+ }, async ({ channel, text, attachments }) => {
11
+ const client = getAgentClient();
12
+ const msg = await client.send(channel, text, attachments ? { attachments } : undefined);
13
+ return { content: [{ type: 'text', text: JSON.stringify(msg, null, 2) }] };
14
+ });
15
+ server.registerTool('get_messages', {
16
+ description: 'Get message history from a channel.',
17
+ inputSchema: {
18
+ channel: z.string().describe('Channel name'),
19
+ limit: z.number().optional().describe('Max messages to return'),
20
+ before: z.string().optional().describe('Cursor: messages before this ID'),
21
+ after: z.string().optional().describe('Cursor: messages after this ID'),
22
+ },
23
+ }, async ({ channel, limit, before, after }) => {
24
+ const client = getAgentClient();
25
+ const msgs = await client.messages(channel, { limit, before, after });
26
+ return { content: [{ type: 'text', text: JSON.stringify(msgs, null, 2) }] };
27
+ });
28
+ server.registerTool('reply_to_thread', {
29
+ description: 'Reply to a message thread.',
30
+ inputSchema: {
31
+ message_id: z.string().describe('Parent message ID'),
32
+ text: z.string().describe('Reply text'),
33
+ },
34
+ }, async ({ message_id, text }) => {
35
+ const client = getAgentClient();
36
+ const reply = await client.reply(message_id, text);
37
+ return { content: [{ type: 'text', text: JSON.stringify(reply, null, 2) }] };
38
+ });
39
+ server.registerTool('get_thread', {
40
+ description: 'Get a thread (parent message + replies).',
41
+ inputSchema: {
42
+ message_id: z.string().describe('Parent message ID'),
43
+ limit: z.number().optional().describe('Max replies to return'),
44
+ },
45
+ }, async ({ message_id, limit }) => {
46
+ const client = getAgentClient();
47
+ const thread = await client.thread(message_id, limit ? { limit } : undefined);
48
+ return { content: [{ type: 'text', text: JSON.stringify(thread, null, 2) }] };
49
+ });
50
+ server.registerTool('send_dm', {
51
+ description: 'Send a direct message to another agent.',
52
+ inputSchema: {
53
+ to: z.string().describe('Recipient agent name'),
54
+ text: z.string().describe('Message text'),
55
+ },
56
+ }, async ({ to, text }) => {
57
+ const client = getAgentClient();
58
+ const result = await client.dm(to, text);
59
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
60
+ });
61
+ server.registerTool('get_dms', {
62
+ description: 'List DM conversations.',
63
+ }, async () => {
64
+ const client = getAgentClient();
65
+ const convos = await client.dms.conversations();
66
+ return { content: [{ type: 'text', text: JSON.stringify(convos, null, 2) }] };
67
+ });
68
+ server.registerTool('send_group_dm', {
69
+ description: 'Create a group DM conversation.',
70
+ inputSchema: {
71
+ participants: z.array(z.string()).describe('Agent names to include'),
72
+ name: z.string().optional().describe('Group name'),
73
+ text: z.string().describe('First message text'),
74
+ },
75
+ }, async ({ participants, name, text }) => {
76
+ const client = getAgentClient();
77
+ const result = await client.dms.createGroup({ participants, name, text });
78
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
79
+ });
80
+ }
81
+ //# sourceMappingURL=messaging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/tools/messaging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Relay, AgentClient } from '@relaycast/sdk';
3
+ export declare function registerProgrammabilityTools(server: McpServer, getRelay: () => Relay, getAgentClient: () => AgentClient): void;
4
+ //# sourceMappingURL=programmability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programmability.d.ts","sourceRoot":"","sources":["../../src/tools/programmability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEzD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,KAAK,EACrB,cAAc,EAAE,MAAM,WAAW,GAChC,IAAI,CAiKN"}
@@ -0,0 +1,150 @@
1
+ import { z } from 'zod';
2
+ export function registerProgrammabilityTools(server, getRelay, getAgentClient) {
3
+ // === Inbound Webhooks ===
4
+ server.registerTool('create_webhook', {
5
+ description: 'Create an inbound webhook that external services can POST to, delivering messages into a channel.',
6
+ inputSchema: {
7
+ name: z.string().describe('Webhook name (e.g. "GitHub Alerts")'),
8
+ channel: z.string().describe('Target channel name'),
9
+ },
10
+ }, async ({ name, channel }) => {
11
+ const relay = getRelay();
12
+ const result = await relay.webhooks.create({ name, channel });
13
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
14
+ });
15
+ server.registerTool('list_webhooks', {
16
+ description: 'List all inbound webhooks in the workspace.',
17
+ }, async () => {
18
+ const relay = getRelay();
19
+ const webhooks = await relay.webhooks.list();
20
+ return { content: [{ type: 'text', text: JSON.stringify(webhooks, null, 2) }] };
21
+ });
22
+ server.registerTool('delete_webhook', {
23
+ description: 'Delete an inbound webhook by ID.',
24
+ inputSchema: {
25
+ webhook_id: z.string().describe('Webhook ID to delete'),
26
+ },
27
+ }, async ({ webhook_id }) => {
28
+ const relay = getRelay();
29
+ await relay.webhooks.delete(webhook_id);
30
+ return { content: [{ type: 'text', text: `Deleted webhook ${webhook_id}` }] };
31
+ });
32
+ server.registerTool('trigger_webhook', {
33
+ description: 'Trigger an inbound webhook to post a message into its channel.',
34
+ inputSchema: {
35
+ webhook_id: z.string().describe('Webhook ID to trigger'),
36
+ text: z.string().optional().describe('Message text'),
37
+ source: z.string().optional().describe('Source identifier (e.g. "github")'),
38
+ },
39
+ }, async ({ webhook_id, text, source }) => {
40
+ const relay = getRelay();
41
+ const result = await relay.webhooks.trigger(webhook_id, { text, source });
42
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
43
+ });
44
+ // === Event Subscriptions ===
45
+ server.registerTool('create_subscription', {
46
+ description: 'Create an outbound event subscription. The server will POST to the given URL when matching events occur.',
47
+ inputSchema: {
48
+ events: z.array(z.string()).describe('Event types to subscribe to (e.g. ["message.created", "reaction.added"])'),
49
+ url: z.string().describe('URL to POST events to'),
50
+ filter_channel: z.string().optional().describe('Only fire for this channel'),
51
+ filter_mentions: z.string().optional().describe('Only fire when this agent is mentioned'),
52
+ secret: z.string().optional().describe('Secret for HMAC signature verification'),
53
+ },
54
+ }, async ({ events, url, filter_channel, filter_mentions, secret }) => {
55
+ const relay = getRelay();
56
+ const filter = (filter_channel || filter_mentions)
57
+ ? { channel: filter_channel, mentions: filter_mentions }
58
+ : undefined;
59
+ const result = await relay.subscriptions.create({
60
+ events: events,
61
+ url,
62
+ filter,
63
+ secret,
64
+ });
65
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
66
+ });
67
+ server.registerTool('list_subscriptions', {
68
+ description: 'List all outbound event subscriptions in the workspace.',
69
+ }, async () => {
70
+ const relay = getRelay();
71
+ const subs = await relay.subscriptions.list();
72
+ return { content: [{ type: 'text', text: JSON.stringify(subs, null, 2) }] };
73
+ });
74
+ server.registerTool('get_subscription', {
75
+ description: 'Get details of a specific event subscription.',
76
+ inputSchema: {
77
+ subscription_id: z.string().describe('Subscription ID'),
78
+ },
79
+ }, async ({ subscription_id }) => {
80
+ const relay = getRelay();
81
+ const sub = await relay.subscriptions.get(subscription_id);
82
+ return { content: [{ type: 'text', text: JSON.stringify(sub, null, 2) }] };
83
+ });
84
+ server.registerTool('delete_subscription', {
85
+ description: 'Delete an event subscription by ID.',
86
+ inputSchema: {
87
+ subscription_id: z.string().describe('Subscription ID to delete'),
88
+ },
89
+ }, async ({ subscription_id }) => {
90
+ const relay = getRelay();
91
+ await relay.subscriptions.delete(subscription_id);
92
+ return { content: [{ type: 'text', text: `Deleted subscription ${subscription_id}` }] };
93
+ });
94
+ // === Agent Commands ===
95
+ server.registerTool('register_command', {
96
+ description: 'Register a slash command that an agent can handle. Other agents can invoke it.',
97
+ inputSchema: {
98
+ command: z.string().describe('Command name (e.g. "deploy")'),
99
+ description: z.string().describe('What the command does'),
100
+ handler_agent: z.string().describe('Name of the agent that handles this command'),
101
+ parameters: z.array(z.object({
102
+ name: z.string(),
103
+ description: z.string().optional(),
104
+ type: z.enum(['string', 'number', 'boolean']),
105
+ required: z.boolean().optional(),
106
+ })).optional().describe('Command parameters'),
107
+ },
108
+ }, async ({ command, description, handler_agent, parameters }) => {
109
+ const relay = getRelay();
110
+ const result = await relay.commands.register({
111
+ command,
112
+ description,
113
+ handler_agent,
114
+ parameters,
115
+ });
116
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
117
+ });
118
+ server.registerTool('list_commands', {
119
+ description: 'List all registered agent commands in the workspace.',
120
+ }, async () => {
121
+ const relay = getRelay();
122
+ const commands = await relay.commands.list();
123
+ return { content: [{ type: 'text', text: JSON.stringify(commands, null, 2) }] };
124
+ });
125
+ server.registerTool('delete_command', {
126
+ description: 'Delete a registered command.',
127
+ inputSchema: {
128
+ command: z.string().describe('Command name to delete'),
129
+ },
130
+ }, async ({ command }) => {
131
+ const relay = getRelay();
132
+ await relay.commands.delete(command);
133
+ return { content: [{ type: 'text', text: `Deleted command /${command}` }] };
134
+ });
135
+ server.registerTool('invoke_command', {
136
+ description: 'Invoke a registered slash command as the current agent.',
137
+ inputSchema: {
138
+ command: z.string().describe('Command name to invoke'),
139
+ channel: z.string().describe('Channel context for invocation'),
140
+ args: z.string().optional().describe('Raw argument string'),
141
+ parameters: z.string().optional().describe('JSON-encoded structured parameters object'),
142
+ },
143
+ }, async ({ command, channel, args, parameters }) => {
144
+ const client = getAgentClient();
145
+ const parsedParams = parameters ? JSON.parse(parameters) : undefined;
146
+ const result = await client.commands.invoke(command, { channel, args, parameters: parsedParams });
147
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
148
+ });
149
+ }
150
+ //# sourceMappingURL=programmability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programmability.js","sourceRoot":"","sources":["../../src/tools/programmability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { Relay } from '@relaycast/sdk';
3
+ import type { SessionState } from '../types.js';
4
+ export declare function registerRegistrationTools(server: McpServer, getRelay: () => Relay, getSession: () => SessionState, setSession: (state: Partial<SessionState>) => void): void;
5
+ //# sourceMappingURL=registration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/tools/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,KAAK,EACrB,UAAU,EAAE,MAAM,YAAY,EAC9B,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,GACjD,IAAI,CA4CN"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ export function registerRegistrationTools(server, getRelay, getSession, setSession) {
3
+ // Tool 1: register
4
+ server.registerTool('register', {
5
+ description: 'Register this agent in the workspace and obtain an agent token for subsequent operations.',
6
+ inputSchema: {
7
+ name: z.string().describe('Unique agent name'),
8
+ type: z.enum(['agent', 'human']).optional().describe('Agent type'),
9
+ persona: z.string().optional().describe('Agent persona description'),
10
+ },
11
+ }, async ({ name, type, persona }) => {
12
+ const relay = getRelay();
13
+ const result = await relay.agents.register({ name, type, persona });
14
+ // Store the agent token in session state
15
+ setSession({ agentToken: result.token, agentName: name });
16
+ return {
17
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
18
+ };
19
+ });
20
+ // Tool 2: list_agents
21
+ server.registerTool('list_agents', {
22
+ description: 'List all agents registered in the workspace.',
23
+ inputSchema: {
24
+ status: z
25
+ .enum(['online', 'offline'])
26
+ .optional()
27
+ .describe('Filter by agent status'),
28
+ },
29
+ }, async ({ status }) => {
30
+ const relay = getRelay();
31
+ const agents = await relay.agents.list(status ? { status } : undefined);
32
+ return {
33
+ content: [{ type: 'text', text: JSON.stringify(agents, null, 2) }],
34
+ };
35
+ });
36
+ }
37
+ //# sourceMappingURL=registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/tools/registration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,yBAAyB,CACvC,MAAiB,EACjB,QAAqB,EACrB,UAA8B,EAC9B,UAAkD;IAElD,mBAAmB;IACnB,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,WAAW,EACT,2FAA2F;QAC7F,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC9C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAClE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SACrE;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,yCAAyC;QACzC,UAAU,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,WAAW,EAAE,8CAA8C;QAC3D,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;iBAC3B,QAAQ,EAAE;iBACV,QAAQ,CAAC,wBAAwB,CAAC;SACtC;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type McpServerOptions } from './server.js';
2
+ /**
3
+ * Start MCP server with stdio transport (single agent).
4
+ * Reads from stdin, writes to stdout.
5
+ */
6
+ export declare function startStdio(options: McpServerOptions): Promise<void>;
7
+ /**
8
+ * Create Express middleware for HTTP+SSE transport (multi-agent).
9
+ * Each connecting client gets its own session with isolated state.
10
+ */
11
+ export declare function createHttpHandler(baseOptions: McpServerOptions): {
12
+ handleRequest: (req: import("node:http").IncomingMessage, res: import("node:http").ServerResponse) => Promise<void>;
13
+ };
14
+ //# sourceMappingURL=transports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transports.d.ts","sourceRoot":"","sources":["../src/transports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG1E;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB;yBAGpD,OAAO,WAAW,EAAE,eAAe,OACnC,OAAO,WAAW,EAAE,cAAc;EAiC5C"}
@@ -0,0 +1,51 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
+ import { createRelayMcpServer } from './server.js';
4
+ import { randomUUID } from 'node:crypto';
5
+ /**
6
+ * Start MCP server with stdio transport (single agent).
7
+ * Reads from stdin, writes to stdout.
8
+ */
9
+ export async function startStdio(options) {
10
+ const mcpServer = createRelayMcpServer(options);
11
+ const transport = new StdioServerTransport();
12
+ await mcpServer.connect(transport);
13
+ }
14
+ /**
15
+ * Session map for HTTP transport (multi-agent).
16
+ * Each session gets its own MCP server + transport instance.
17
+ */
18
+ const sessions = new Map();
19
+ /**
20
+ * Create Express middleware for HTTP+SSE transport (multi-agent).
21
+ * Each connecting client gets its own session with isolated state.
22
+ */
23
+ export function createHttpHandler(baseOptions) {
24
+ return {
25
+ handleRequest: async (req, res) => {
26
+ // Check for existing session
27
+ const sessionId = req.headers['mcp-session-id'];
28
+ if (sessionId && sessions.has(sessionId)) {
29
+ const session = sessions.get(sessionId);
30
+ await session.transport.handleRequest(req, res);
31
+ return;
32
+ }
33
+ // New session — create fresh MCP server + transport
34
+ const transport = new StreamableHTTPServerTransport({
35
+ sessionIdGenerator: () => randomUUID(),
36
+ });
37
+ const mcpServer = createRelayMcpServer(baseOptions);
38
+ transport.onclose = () => {
39
+ if (transport.sessionId) {
40
+ sessions.delete(transport.sessionId);
41
+ }
42
+ };
43
+ await mcpServer.connect(transport);
44
+ if (transport.sessionId) {
45
+ sessions.set(transport.sessionId, { transport });
46
+ }
47
+ await transport.handleRequest(req, res);
48
+ },
49
+ };
50
+ }
51
+ //# sourceMappingURL=transports.js.map
@@ -0,0 +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,EAAyB,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAyB;IACxD,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwD,CAAC;AAEjF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAA6B;IAC7D,OAAO;QACL,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,oDAAoD;YACpD,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;aACvC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;YAEpD,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACvB,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;oBACxB,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEnC,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { WsBridge } from './resources/ws-bridge.js';
2
+ import type { SubscriptionManager } from './resources/subscriptions.js';
3
+ export interface SessionState {
4
+ agentToken: string | null;
5
+ agentName: string | null;
6
+ wsBridge: WsBridge | null;
7
+ subscriptions: SubscriptionManager | null;
8
+ }
9
+ export declare function createInitialSession(): SessionState;
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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,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;CAC3C;AAED,wBAAgB,oBAAoB,IAAI,YAAY,CAEnD"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ export function createInitialSession() {
2
+ return { agentToken: null, agentName: null, wsBridge: null, subscriptions: null };
3
+ }
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,oBAAoB;IAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AACpF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@relaycast/mcp",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "test": "vitest run"
10
+ },
11
+ "dependencies": {
12
+ "@relaycast/sdk": "*",
13
+ "@relaycast/types": "*",
14
+ "@modelcontextprotocol/sdk": "^1.26.0",
15
+ "express": "^5.2.1",
16
+ "zod": "^4.3.6"
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "devDependencies": {
22
+ "@types/express": "^5.0.6",
23
+ "vitest": "^4.0.18"
24
+ }
25
+ }