@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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { MCP_VERSION } from '../index.js';
3
+ describe('@agent-relay/mcp', () => {
4
+ it('exports MCP_VERSION', () => {
5
+ expect(MCP_VERSION).toBe('0.1.0');
6
+ });
7
+ });
8
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const MCP_VERSION: "0.1.0";
2
+ export { createRelayMcpServer } from './server.js';
3
+ export type { McpServerOptions } from './server.js';
4
+ export { startStdio, createHttpHandler } from './transports.js';
5
+ export { DEFAULT_SYSTEM_PROMPT } from './prompts.js';
6
+ export type { SessionState } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,EAAG,OAAgB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export const MCP_VERSION = '0.1.0';
2
+ export { createRelayMcpServer } from './server.js';
3
+ export { startStdio, createHttpHandler } from './transports.js';
4
+ export { DEFAULT_SYSTEM_PROMPT } from './prompts.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,OAAgB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AgentClient } from '@relaycast/sdk';
3
+ import type { SessionState } from './types.js';
4
+ export declare function enablePiggyback(mcpServer: McpServer, getSession: () => SessionState, getAgentClient: () => AgentClient): void;
5
+ //# sourceMappingURL=piggyback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piggyback.d.ts","sourceRoot":"","sources":["../src/piggyback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,YAAY,EAC9B,cAAc,EAAE,MAAM,WAAW,GAChC,IAAI,CAyCN"}
@@ -0,0 +1,55 @@
1
+ const SKIP_PIGGYBACK = new Set(['check_inbox', 'register']);
2
+ export function enablePiggyback(mcpServer, getSession, getAgentClient) {
3
+ const original = mcpServer.registerTool.bind(mcpServer);
4
+ mcpServer.registerTool = (name, config, handler) => {
5
+ if (SKIP_PIGGYBACK.has(name) || !handler) {
6
+ return original(name, config, handler);
7
+ }
8
+ const wrapped = async (...args) => {
9
+ const result = await handler(...args);
10
+ if (!getSession().agentToken)
11
+ return result;
12
+ try {
13
+ const client = getAgentClient();
14
+ const inbox = await client.inbox();
15
+ const hasUnread = (inbox.unread_channels?.length ?? 0) > 0 ||
16
+ (inbox.mentions?.length ?? 0) > 0 ||
17
+ (inbox.unread_dms?.length ?? 0) > 0;
18
+ if (hasUnread) {
19
+ result.content.push({
20
+ type: 'text',
21
+ text: formatInbox(inbox),
22
+ });
23
+ }
24
+ }
25
+ catch {
26
+ // Silently ignore — never break the original tool response
27
+ }
28
+ return result;
29
+ };
30
+ return original(name, config, wrapped);
31
+ };
32
+ }
33
+ function formatInbox(inbox) {
34
+ const lines = ['--- Pending Messages ---'];
35
+ if (inbox.unread_channels?.length) {
36
+ lines.push('Unread channels:');
37
+ for (const ch of inbox.unread_channels) {
38
+ lines.push(` #${ch.channel_name}: ${ch.unread_count} unread`);
39
+ }
40
+ }
41
+ if (inbox.mentions?.length) {
42
+ lines.push('Mentions:');
43
+ for (const m of inbox.mentions) {
44
+ lines.push(` @${m.agent_name} in #${m.channel_name}: "${m.text}"`);
45
+ }
46
+ }
47
+ if (inbox.unread_dms?.length) {
48
+ lines.push('Unread DMs:');
49
+ for (const dm of inbox.unread_dms) {
50
+ lines.push(` From ${dm.from}: ${dm.unread_count} unread`);
51
+ }
52
+ }
53
+ return lines.join('\n');
54
+ }
55
+ //# sourceMappingURL=piggyback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piggyback.js","sourceRoot":"","sources":["../src/piggyback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ declare const DEFAULT_SYSTEM_PROMPT = "You are an AI agent in a collaborative workspace powered by Agent Relay. You can communicate with other agents using the following tools:\n\n## Getting Started\n1. Call \"register\" with your agent name to join the workspace\n2. Use \"list_channels\" to see available channels\n3. Use \"join_channel\" to join channels of interest\n4. Use \"check_inbox\" to see unread messages and mentions\n\n## Communication\n- Post messages to channels with \"post_message\"\n- Send direct messages with \"send_dm\"\n- Reply to threads with \"reply_to_thread\"\n- React to messages with \"add_reaction\"\n\n## Best Practices\n- Check your inbox regularly for new messages and mentions\n- Use channels for topic-based discussions\n- Use threads for detailed discussions to keep channels organized\n- React with emoji to acknowledge messages (e.g. thumbsup for agreement)\n- Keep messages concise and actionable";
3
+ export declare function registerSystemPrompt(server: McpServer): void;
4
+ export { DEFAULT_SYSTEM_PROMPT };
5
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,QAAA,MAAM,qBAAqB,q4BAmBY,CAAC;AAExC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoB5D;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ const DEFAULT_SYSTEM_PROMPT = `You are an AI agent in a collaborative workspace powered by Agent Relay. You can communicate with other agents using the following tools:
2
+
3
+ ## Getting Started
4
+ 1. Call "register" with your agent name to join the workspace
5
+ 2. Use "list_channels" to see available channels
6
+ 3. Use "join_channel" to join channels of interest
7
+ 4. Use "check_inbox" to see unread messages and mentions
8
+
9
+ ## Communication
10
+ - Post messages to channels with "post_message"
11
+ - Send direct messages with "send_dm"
12
+ - Reply to threads with "reply_to_thread"
13
+ - React to messages with "add_reaction"
14
+
15
+ ## Best Practices
16
+ - Check your inbox regularly for new messages and mentions
17
+ - Use channels for topic-based discussions
18
+ - Use threads for detailed discussions to keep channels organized
19
+ - React with emoji to acknowledge messages (e.g. thumbsup for agreement)
20
+ - Keep messages concise and actionable`;
21
+ export function registerSystemPrompt(server) {
22
+ server.registerPrompt('system_prompt', {
23
+ description: 'Default system prompt for AI agents using Agent Relay.',
24
+ }, async () => {
25
+ return {
26
+ messages: [
27
+ {
28
+ role: 'user',
29
+ content: {
30
+ type: 'text',
31
+ text: DEFAULT_SYSTEM_PROMPT,
32
+ },
33
+ },
34
+ ],
35
+ };
36
+ });
37
+ }
38
+ export { DEFAULT_SYSTEM_PROMPT };
39
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;uCAmBS,CAAC;AAExC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,cAAc,CACnB,eAAe,EACf;QACE,WAAW,EAAE,wDAAwD;KACtE,EACD,KAAK,IAAI,EAAE;QACT,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,qBAAqB;qBAC5B;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AgentClient, Relay } from '@relaycast/sdk';
3
+ export declare function registerResourceDefinitions(server: McpServer, getAgentClient: () => AgentClient, getRelay: () => Relay): void;
4
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/resources/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEzD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,MAAM,WAAW,EACjC,QAAQ,EAAE,MAAM,KAAK,GACpB,IAAI,CAwEN"}
@@ -0,0 +1,40 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerResourceDefinitions(server, getAgentClient, getRelay) {
3
+ // Static resource: inbox
4
+ server.registerResource('inbox', 'relay://inbox', { title: 'Inbox', description: 'Unread messages, mentions, and DMs', mimeType: 'application/json' }, async (uri) => {
5
+ const client = getAgentClient();
6
+ const inbox = await client.inbox();
7
+ return { contents: [{ uri: uri.href, text: JSON.stringify(inbox) }] };
8
+ });
9
+ // Static resource: agents
10
+ server.registerResource('agents', 'relay://agents', { title: 'Agents', description: 'Online and offline agents in the workspace', mimeType: 'application/json' }, async (uri) => {
11
+ const relay = getRelay();
12
+ const agents = await relay.agents.list();
13
+ return { contents: [{ uri: uri.href, text: JSON.stringify(agents) }] };
14
+ });
15
+ // Static resource: channels
16
+ server.registerResource('channels', 'relay://channels', { title: 'Channels', description: 'Available channels in the workspace', mimeType: 'application/json' }, async (uri) => {
17
+ const client = getAgentClient();
18
+ const channels = await client.channels.list();
19
+ return { contents: [{ uri: uri.href, text: JSON.stringify(channels) }] };
20
+ });
21
+ // Template: channel messages
22
+ server.registerResource('channel-messages', new ResourceTemplate('relay://channels/{name}/messages', { list: undefined }), { title: 'Channel Messages', description: 'Messages in a specific channel', mimeType: 'application/json' }, async (uri, params) => {
23
+ const client = getAgentClient();
24
+ const messages = await client.messages(params.name);
25
+ return { contents: [{ uri: uri.href, text: JSON.stringify(messages) }] };
26
+ });
27
+ // Template: message thread
28
+ server.registerResource('message-thread', new ResourceTemplate('relay://messages/{id}/thread', { list: undefined }), { title: 'Message Thread', description: 'Thread replies on a message', mimeType: 'application/json' }, async (uri, params) => {
29
+ const client = getAgentClient();
30
+ const thread = await client.thread(params.id);
31
+ return { contents: [{ uri: uri.href, text: JSON.stringify(thread) }] };
32
+ });
33
+ // Template: DM conversation
34
+ server.registerResource('dm-conversation', new ResourceTemplate('relay://dm/{conversation_id}', { list: undefined }), { title: 'DM Conversation', description: 'Direct message conversation', mimeType: 'application/json' }, async (uri, params) => {
35
+ const client = getAgentClient();
36
+ const messages = await client.dms.messages(params.conversation_id);
37
+ return { contents: [{ uri: uri.href, text: JSON.stringify(messages) }] };
38
+ });
39
+ }
40
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/resources/definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { registerResourceDefinitions } from './definitions.js';
2
+ export { SubscriptionManager } from './subscriptions.js';
3
+ export { WsBridge, eventToResourceUris } from './ws-bridge.js';
4
+ export type { NotifyCallback } from './ws-bridge.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { registerResourceDefinitions } from './definitions.js';
2
+ export { SubscriptionManager } from './subscriptions.js';
3
+ export { WsBridge, eventToResourceUris } from './ws-bridge.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Manages resource subscription state.
3
+ * Tracks which relay:// URIs the client has subscribed to.
4
+ */
5
+ export declare class SubscriptionManager {
6
+ private subscriptions;
7
+ subscribe(uri: string): void;
8
+ unsubscribe(uri: string): void;
9
+ isSubscribed(uri: string): boolean;
10
+ /**
11
+ * Returns all subscribed URIs that match the given list.
12
+ * Used by the ws-bridge to find which subscriptions to notify.
13
+ */
14
+ getMatchingSubscriptions(uris: string[]): string[];
15
+ getAll(): string[];
16
+ clear(): void;
17
+ }
18
+ //# sourceMappingURL=subscriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../../src/resources/subscriptions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,aAAa,CAAqB;IAE1C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI5B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI9B,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIlC;;;OAGG;IACH,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAIlD,MAAM,IAAI,MAAM,EAAE;IAIlB,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Manages resource subscription state.
3
+ * Tracks which relay:// URIs the client has subscribed to.
4
+ */
5
+ export class SubscriptionManager {
6
+ subscriptions = new Set();
7
+ subscribe(uri) {
8
+ this.subscriptions.add(uri);
9
+ }
10
+ unsubscribe(uri) {
11
+ this.subscriptions.delete(uri);
12
+ }
13
+ isSubscribed(uri) {
14
+ return this.subscriptions.has(uri);
15
+ }
16
+ /**
17
+ * Returns all subscribed URIs that match the given list.
18
+ * Used by the ws-bridge to find which subscriptions to notify.
19
+ */
20
+ getMatchingSubscriptions(uris) {
21
+ return uris.filter((uri) => this.subscriptions.has(uri));
22
+ }
23
+ getAll() {
24
+ return [...this.subscriptions];
25
+ }
26
+ clear() {
27
+ this.subscriptions.clear();
28
+ }
29
+ }
30
+ //# sourceMappingURL=subscriptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/resources/subscriptions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACtB,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,wBAAwB,CAAC,IAAc;QACrC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ import type { ServerEvent } from '@relaycast/types';
2
+ import type { WsClient } from '@relaycast/sdk';
3
+ import type { SubscriptionManager } from './subscriptions.js';
4
+ /**
5
+ * Maps a WebSocket ServerEvent to the relay:// resource URIs it affects.
6
+ */
7
+ export declare function eventToResourceUris(event: ServerEvent): string[];
8
+ export type NotifyCallback = (uri: string) => void;
9
+ /**
10
+ * Bridges WebSocket events to MCP resource update notifications.
11
+ * Connects a WsClient to the SubscriptionManager and fires a callback
12
+ * for each subscribed resource URI affected by an incoming event.
13
+ */
14
+ export declare class WsBridge {
15
+ private wsClient;
16
+ private subscriptions;
17
+ private notifyCallback;
18
+ private unsubscribeFn;
19
+ constructor(wsClient: WsClient, subscriptions: SubscriptionManager, notifyCallback: NotifyCallback);
20
+ /**
21
+ * Start listening to WebSocket events and dispatching resource notifications.
22
+ */
23
+ start(): void;
24
+ /**
25
+ * Stop listening and disconnect the WebSocket.
26
+ */
27
+ stop(): void;
28
+ }
29
+ //# sourceMappingURL=ws-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-bridge.d.ts","sourceRoot":"","sources":["../../src/resources/ws-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAiChE;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAEnD;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAA6B;gBAGhD,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,mBAAmB,EAClC,cAAc,EAAE,cAAc;IAOhC;;OAEG;IACH,KAAK,IAAI,IAAI;IAYb;;OAEG;IACH,IAAI,IAAI,IAAI;CAOb"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Maps a WebSocket ServerEvent to the relay:// resource URIs it affects.
3
+ */
4
+ export function eventToResourceUris(event) {
5
+ switch (event.type) {
6
+ case 'message.created':
7
+ return [
8
+ 'relay://inbox',
9
+ `relay://channels/${event.channel}/messages`,
10
+ ];
11
+ case 'message.updated':
12
+ return [`relay://channels/${event.channel}/messages`];
13
+ case 'thread.reply':
14
+ return [
15
+ 'relay://inbox',
16
+ `relay://messages/${event.parent_id}/thread`,
17
+ ];
18
+ case 'dm.received':
19
+ return [
20
+ 'relay://inbox',
21
+ `relay://dm/${event.conversation_id}`,
22
+ ];
23
+ case 'group_dm.received':
24
+ return [
25
+ 'relay://inbox',
26
+ `relay://dm/${event.conversation_id}`,
27
+ ];
28
+ case 'agent.online':
29
+ case 'agent.offline':
30
+ return ['relay://agents'];
31
+ case 'channel.created':
32
+ case 'channel.archived':
33
+ return ['relay://channels'];
34
+ default:
35
+ return [];
36
+ }
37
+ }
38
+ /**
39
+ * Bridges WebSocket events to MCP resource update notifications.
40
+ * Connects a WsClient to the SubscriptionManager and fires a callback
41
+ * for each subscribed resource URI affected by an incoming event.
42
+ */
43
+ export class WsBridge {
44
+ wsClient;
45
+ subscriptions;
46
+ notifyCallback;
47
+ unsubscribeFn = null;
48
+ constructor(wsClient, subscriptions, notifyCallback) {
49
+ this.wsClient = wsClient;
50
+ this.subscriptions = subscriptions;
51
+ this.notifyCallback = notifyCallback;
52
+ }
53
+ /**
54
+ * Start listening to WebSocket events and dispatching resource notifications.
55
+ */
56
+ start() {
57
+ this.unsubscribeFn = this.wsClient.on('*', (event) => {
58
+ const uris = eventToResourceUris(event);
59
+ const matched = this.subscriptions.getMatchingSubscriptions(uris);
60
+ for (const uri of matched) {
61
+ this.notifyCallback(uri);
62
+ }
63
+ });
64
+ this.wsClient.connect();
65
+ }
66
+ /**
67
+ * Stop listening and disconnect the WebSocket.
68
+ */
69
+ stop() {
70
+ if (this.unsubscribeFn) {
71
+ this.unsubscribeFn();
72
+ this.unsubscribeFn = null;
73
+ }
74
+ this.wsClient.disconnect();
75
+ }
76
+ }
77
+ //# sourceMappingURL=ws-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-bridge.js","sourceRoot":"","sources":["../../src/resources/ws-bridge.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACpD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,iBAAiB;YACpB,OAAO;gBACL,eAAe;gBACf,oBAAqB,KAAa,CAAC,OAAO,WAAW;aACtD,CAAC;QACJ,KAAK,iBAAiB;YACpB,OAAO,CAAC,oBAAqB,KAAa,CAAC,OAAO,WAAW,CAAC,CAAC;QACjE,KAAK,cAAc;YACjB,OAAO;gBACL,eAAe;gBACf,oBAAqB,KAAa,CAAC,SAAS,SAAS;aACtD,CAAC;QACJ,KAAK,aAAa;YAChB,OAAO;gBACL,eAAe;gBACf,cAAe,KAAa,CAAC,eAAe,EAAE;aAC/C,CAAC;QACJ,KAAK,mBAAmB;YACtB,OAAO;gBACL,eAAe;gBACf,cAAe,KAAa,CAAC,eAAe,EAAE;aAC/C,CAAC;QACJ,KAAK,cAAc,CAAC;QACpB,KAAK,eAAe;YAClB,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC5B,KAAK,iBAAiB,CAAC;QACvB,KAAK,kBAAkB;YACrB,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC9B;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAID;;;;GAIG;AACH,MAAM,OAAO,QAAQ;IACX,QAAQ,CAAW;IACnB,aAAa,CAAsB;IACnC,cAAc,CAAiB;IAC/B,aAAa,GAAwB,IAAI,CAAC;IAElD,YACE,QAAkB,EAClB,aAAkC,EAClC,cAA8B;QAE9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAkB,EAAE,EAAE;YAChE,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAClE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export interface McpServerOptions {
3
+ apiKey: string;
4
+ baseUrl?: string;
5
+ }
6
+ export declare function createRelayMcpServer(options: McpServerOptions): McpServer;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAcpE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAiEzE"}
package/dist/server.js ADDED
@@ -0,0 +1,66 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { Relay, WsClient } from '@relaycast/sdk';
3
+ import { registerRegistrationTools } from './tools/registration.js';
4
+ import { registerChannelTools } from './tools/channels.js';
5
+ import { registerMessagingTools } from './tools/messaging.js';
6
+ import { registerFeatureTools } from './tools/features.js';
7
+ import { registerProgrammabilityTools } from './tools/programmability.js';
8
+ import { registerSystemPrompt } from './prompts.js';
9
+ import { createInitialSession } from './types.js';
10
+ import { enablePiggyback } from './piggyback.js';
11
+ import { registerResourceDefinitions } from './resources/definitions.js';
12
+ import { SubscriptionManager } from './resources/subscriptions.js';
13
+ import { WsBridge } from './resources/ws-bridge.js';
14
+ export function createRelayMcpServer(options) {
15
+ const relay = new Relay({ apiKey: options.apiKey, baseUrl: options.baseUrl });
16
+ const session = createInitialSession();
17
+ const mcpServer = new McpServer({ name: 'agent-relay', version: '0.1.0' }, {
18
+ capabilities: {
19
+ resources: { subscribe: true, listChanged: true },
20
+ tools: {},
21
+ prompts: {},
22
+ },
23
+ });
24
+ const getRelay = () => relay;
25
+ const getSession = () => session;
26
+ const setSession = (partial) => {
27
+ // When an agent token is set, initialize the WebSocket bridge
28
+ if (partial.agentToken && !session.wsBridge) {
29
+ const subscriptions = new SubscriptionManager();
30
+ const wsClient = new WsClient({
31
+ token: partial.agentToken,
32
+ baseUrl: options.baseUrl,
33
+ });
34
+ const wsBridge = new WsBridge(wsClient, subscriptions, (uri) => {
35
+ mcpServer.server.sendResourceUpdated({ uri }).catch(() => {
36
+ // Silently ignore notification failures
37
+ });
38
+ });
39
+ wsBridge.start();
40
+ Object.assign(session, partial, { wsBridge, subscriptions });
41
+ }
42
+ else {
43
+ Object.assign(session, partial);
44
+ }
45
+ };
46
+ const getAgentClient = () => {
47
+ if (!session.agentToken) {
48
+ throw new Error('Not registered. Call the "register" tool first.');
49
+ }
50
+ return relay.as(session.agentToken);
51
+ };
52
+ // Enable piggybacking of unread messages on all tool responses
53
+ enablePiggyback(mcpServer, getSession, getAgentClient);
54
+ // Register resource definitions (inbox, agents, channels, etc.)
55
+ registerResourceDefinitions(mcpServer, getAgentClient, getRelay);
56
+ // Register all tools
57
+ registerRegistrationTools(mcpServer, getRelay, getSession, setSession);
58
+ registerChannelTools(mcpServer, getAgentClient);
59
+ registerMessagingTools(mcpServer, getAgentClient);
60
+ registerFeatureTools(mcpServer, getAgentClient);
61
+ registerProgrammabilityTools(mcpServer, getRelay, getAgentClient);
62
+ // Register system prompt
63
+ registerSystemPrompt(mcpServer);
64
+ return mcpServer;
65
+ }
66
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { AgentClient } from '@relaycast/sdk';
3
+ export declare function registerChannelTools(server: McpServer, getAgentClient: () => AgentClient): void;
4
+ //# sourceMappingURL=channels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../src/tools/channels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,MAAM,WAAW,GAChC,IAAI,CAuHN"}
@@ -0,0 +1,86 @@
1
+ import { z } from 'zod';
2
+ export function registerChannelTools(server, getAgentClient) {
3
+ // Tool 3: create_channel
4
+ server.registerTool('create_channel', {
5
+ description: 'Create a new channel in the workspace.',
6
+ inputSchema: {
7
+ name: z.string().describe('Channel name (no spaces, lowercase)'),
8
+ topic: z.string().optional().describe('Channel topic/description'),
9
+ },
10
+ }, async ({ name, topic }) => {
11
+ const client = getAgentClient();
12
+ const channel = await client.channels.create({ name, topic });
13
+ return { content: [{ type: 'text', text: JSON.stringify(channel, null, 2) }] };
14
+ });
15
+ // Tool 4: list_channels
16
+ server.registerTool('list_channels', {
17
+ description: 'List all channels in the workspace.',
18
+ inputSchema: {
19
+ include_archived: z.boolean().optional().describe('Include archived channels'),
20
+ },
21
+ }, async ({ include_archived }) => {
22
+ const client = getAgentClient();
23
+ const channels = await client.channels.list(include_archived ? { include_archived } : undefined);
24
+ return {
25
+ content: [{ type: 'text', text: JSON.stringify(channels, null, 2) }],
26
+ };
27
+ });
28
+ // Tool 5: join_channel
29
+ server.registerTool('join_channel', {
30
+ description: 'Join a channel.',
31
+ inputSchema: {
32
+ channel: z.string().describe('Channel name to join'),
33
+ },
34
+ }, async ({ channel }) => {
35
+ const client = getAgentClient();
36
+ await client.channels.join(channel);
37
+ return { content: [{ type: 'text', text: `Joined channel #${channel}` }] };
38
+ });
39
+ // Tool 6: leave_channel
40
+ server.registerTool('leave_channel', {
41
+ description: 'Leave a channel.',
42
+ inputSchema: {
43
+ channel: z.string().describe('Channel name to leave'),
44
+ },
45
+ }, async ({ channel }) => {
46
+ const client = getAgentClient();
47
+ await client.channels.leave(channel);
48
+ return { content: [{ type: 'text', text: `Left channel #${channel}` }] };
49
+ });
50
+ // Tool 7: invite_to_channel
51
+ server.registerTool('invite_to_channel', {
52
+ description: 'Invite an agent to a channel.',
53
+ inputSchema: {
54
+ channel: z.string().describe('Channel name'),
55
+ agent: z.string().describe('Agent name to invite'),
56
+ },
57
+ }, async ({ channel, agent }) => {
58
+ const client = getAgentClient();
59
+ await client.channels.invite(channel, agent);
60
+ return { content: [{ type: 'text', text: `Invited ${agent} to #${channel}` }] };
61
+ });
62
+ // Tool 8: set_channel_topic
63
+ server.registerTool('set_channel_topic', {
64
+ description: 'Set the topic for a channel.',
65
+ inputSchema: {
66
+ channel: z.string().describe('Channel name'),
67
+ topic: z.string().describe('New topic text'),
68
+ },
69
+ }, async ({ channel, topic }) => {
70
+ const client = getAgentClient();
71
+ const updated = await client.channels.setTopic(channel, topic);
72
+ return { content: [{ type: 'text', text: JSON.stringify(updated, null, 2) }] };
73
+ });
74
+ // Tool 9: archive_channel
75
+ server.registerTool('archive_channel', {
76
+ description: 'Archive a channel (soft delete).',
77
+ inputSchema: {
78
+ channel: z.string().describe('Channel name to archive'),
79
+ },
80
+ }, async ({ channel }) => {
81
+ const client = getAgentClient();
82
+ await client.channels.archive(channel);
83
+ return { content: [{ type: 'text', text: `Archived channel #${channel}` }] };
84
+ });
85
+ }
86
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/tools/channels.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 registerFeatureTools(server: McpServer, getAgentClient: () => AgentClient): void;
4
+ //# sourceMappingURL=features.d.ts.map