@relaycast/mcp 0.1.1 → 0.1.3

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 CHANGED
@@ -1,5 +1,4 @@
1
- export declare const MCP_VERSION: "0.1.0";
2
- export { createRelayMcpServer } from './server.js';
1
+ export { createRelayMcpServer, MCP_VERSION } from './server.js';
3
2
  export type { McpServerOptions } from './server.js';
4
3
  export { startStdio, createHttpHandler } from './transports.js';
5
4
  export { DEFAULT_SYSTEM_PROMPT } from './prompts.js';
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChE,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 CHANGED
@@ -1,5 +1,4 @@
1
- export const MCP_VERSION = '0.1.0';
2
- export { createRelayMcpServer } from './server.js';
1
+ export { createRelayMcpServer, MCP_VERSION } from './server.js';
3
2
  export { startStdio, createHttpHandler } from './transports.js';
4
3
  export { DEFAULT_SYSTEM_PROMPT } from './prompts.js';
5
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import type { AgentClient } from '@relaycast/sdk';
3
3
  import type { SessionState } from './types.js';
4
- export declare function enablePiggyback(mcpServer: McpServer, getSession: () => SessionState, getAgentClient: () => AgentClient): void;
4
+ import type { McpTelemetry } from './telemetry.js';
5
+ export declare function enablePiggyback(mcpServer: McpServer, getSession: () => SessionState, getAgentClient: () => AgentClient, telemetry?: McpTelemetry): void;
5
6
  //# sourceMappingURL=piggyback.d.ts.map
@@ -1 +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"}
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;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAYnD,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,YAAY,EAC9B,cAAc,EAAE,MAAM,WAAW,EACjC,SAAS,CAAC,EAAE,YAAY,GACvB,IAAI,CAoFN"}
package/dist/piggyback.js CHANGED
@@ -1,13 +1,63 @@
1
1
  const SKIP_PIGGYBACK = new Set(['check_inbox', 'register']);
2
- export function enablePiggyback(mcpServer, getSession, getAgentClient) {
2
+ const MESSAGE_TOOLS = new Set([
3
+ 'post_message',
4
+ 'reply_to_thread',
5
+ 'send_dm',
6
+ 'send_group_dm',
7
+ 'trigger_webhook',
8
+ 'invoke_command',
9
+ ]);
10
+ export function enablePiggyback(mcpServer, getSession, getAgentClient, telemetry) {
3
11
  const original = mcpServer.registerTool.bind(mcpServer);
4
12
  mcpServer.registerTool = (name, config, handler) => {
5
- if (SKIP_PIGGYBACK.has(name) || !handler) {
13
+ if (!handler) {
6
14
  return original(name, config, handler);
7
15
  }
16
+ const shouldPiggybackInbox = !SKIP_PIGGYBACK.has(name);
8
17
  const wrapped = async (...args) => {
9
- const result = await handler(...args);
10
- if (!getSession().agentToken)
18
+ const startedAt = Date.now();
19
+ telemetry?.capture('relaycast_mcp_tool_invoked', {
20
+ source_surface: 'mcp',
21
+ tool_name: name,
22
+ });
23
+ let result;
24
+ try {
25
+ result = await handler(...args);
26
+ }
27
+ catch (error) {
28
+ telemetry?.capture('relaycast_mcp_tool_failed', {
29
+ source_surface: 'mcp',
30
+ tool_name: name,
31
+ duration_ms: Math.max(Date.now() - startedAt, 0),
32
+ error_name: error instanceof Error ? error.name : 'UnknownError',
33
+ });
34
+ throw error;
35
+ }
36
+ telemetry?.capture('relaycast_mcp_tool_completed', {
37
+ source_surface: 'mcp',
38
+ tool_name: name,
39
+ duration_ms: Math.max(Date.now() - startedAt, 0),
40
+ });
41
+ if (MESSAGE_TOOLS.has(name)) {
42
+ telemetry?.capture('relaycast_message_sent', {
43
+ source_surface: 'mcp',
44
+ tool_name: name,
45
+ message_kind: name,
46
+ });
47
+ }
48
+ else if (name === 'check_inbox') {
49
+ telemetry?.capture('relaycast_inbox_checked', {
50
+ source_surface: 'mcp',
51
+ tool_name: name,
52
+ });
53
+ }
54
+ else if (name === 'register') {
55
+ telemetry?.capture('relaycast_agent_registered', {
56
+ source_surface: 'mcp',
57
+ tool_name: name,
58
+ });
59
+ }
60
+ if (!shouldPiggybackInbox || !getSession().agentToken)
11
61
  return result;
12
62
  try {
13
63
  const client = getAgentClient();
@@ -15,7 +65,7 @@ export function enablePiggyback(mcpServer, getSession, getAgentClient) {
15
65
  const hasUnread = (inbox.unread_channels?.length ?? 0) > 0 ||
16
66
  (inbox.mentions?.length ?? 0) > 0 ||
17
67
  (inbox.unread_dms?.length ?? 0) > 0;
18
- if (hasUnread) {
68
+ if (hasUnread && Array.isArray(result?.content)) {
19
69
  result.content.push({
20
70
  type: 'text',
21
71
  text: formatInbox(inbox),
@@ -1 +1 @@
1
- {"version":3,"file":"piggyback.js","sourceRoot":"","sources":["../src/piggyback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"piggyback.js","sourceRoot":"","sources":["../src/piggyback.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,7 +1,11 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { type McpTelemetry } from './telemetry.js';
3
+ export declare const MCP_VERSION = "0.1.2";
2
4
  export interface McpServerOptions {
3
5
  apiKey: string;
4
6
  baseUrl?: string;
7
+ telemetryTransport?: 'stdio' | 'http';
8
+ telemetry?: McpTelemetry;
5
9
  }
6
10
  export declare function createRelayMcpServer(options: McpServerOptions): McpServer;
7
11
  //# sourceMappingURL=server.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEvE,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACtC,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA2EzE"}
package/dist/server.js CHANGED
@@ -11,16 +11,23 @@ import { enablePiggyback } from './piggyback.js';
11
11
  import { registerResourceDefinitions } from './resources/definitions.js';
12
12
  import { SubscriptionManager } from './resources/subscriptions.js';
13
13
  import { WsBridge } from './resources/ws-bridge.js';
14
+ import { createMcpTelemetry } from './telemetry.js';
15
+ export const MCP_VERSION = '0.1.2';
14
16
  export function createRelayMcpServer(options) {
15
17
  const relay = new Relay({ apiKey: options.apiKey, baseUrl: options.baseUrl });
16
18
  const session = createInitialSession();
17
- const mcpServer = new McpServer({ name: 'agent-relay', version: '0.1.0' }, {
19
+ const telemetry = options.telemetry ?? createMcpTelemetry(MCP_VERSION);
20
+ const mcpServer = new McpServer({ name: 'agent-relay', version: MCP_VERSION }, {
18
21
  capabilities: {
19
22
  resources: { subscribe: true, listChanged: true },
20
23
  tools: {},
21
24
  prompts: {},
22
25
  },
23
26
  });
27
+ telemetry.capture('relaycast_mcp_server_started', {
28
+ source_surface: 'mcp',
29
+ transport: options.telemetryTransport ?? 'unknown',
30
+ });
24
31
  const getRelay = () => relay;
25
32
  const getSession = () => session;
26
33
  const setSession = (partial) => {
@@ -38,6 +45,10 @@ export function createRelayMcpServer(options) {
38
45
  });
39
46
  wsBridge.start();
40
47
  Object.assign(session, partial, { wsBridge, subscriptions });
48
+ telemetry.capture('relaycast_mcp_session_authenticated', {
49
+ source_surface: 'mcp',
50
+ agent_name: partial.agentName ?? session.agentName ?? null,
51
+ });
41
52
  }
42
53
  else {
43
54
  Object.assign(session, partial);
@@ -50,7 +61,7 @@ export function createRelayMcpServer(options) {
50
61
  return relay.as(session.agentToken);
51
62
  };
52
63
  // Enable piggybacking of unread messages on all tool responses
53
- enablePiggyback(mcpServer, getSession, getAgentClient);
64
+ enablePiggyback(mcpServer, getSession, getAgentClient, telemetry);
54
65
  // Register resource definitions (inbox, agents, channels, etc.)
55
66
  registerResourceDefinitions(mcpServer, getAgentClient, getRelay);
56
67
  // Register all tools
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface McpTelemetry {
2
+ capture: (event: string, properties?: Record<string, unknown>) => void;
3
+ flush: (timeoutMs?: number) => Promise<void>;
4
+ }
5
+ export declare function createMcpTelemetry(version?: string): McpTelemetry;
6
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACvE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AA6GD,wBAAgB,kBAAkB,CAAC,OAAO,SAAY,GAAG,YAAY,CA2CpE"}
@@ -0,0 +1,145 @@
1
+ import fs from 'node:fs';
2
+ import http from 'node:http';
3
+ import https from 'node:https';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { randomUUID } from 'node:crypto';
7
+ const TELEMETRY_PATH = path.join(os.homedir(), '.relay', 'telemetry.json');
8
+ const DEFAULT_POSTHOG_HOST = 'https://us.i.posthog.com';
9
+ const DEFAULT_POSTHOG_KEY = 'phc_OAqBdey9pESZCcwaen9Fpyz6Ez8QKiMmLOnvFknXzg4';
10
+ function isTruthy(value) {
11
+ if (!value)
12
+ return false;
13
+ const normalized = value.trim().toLowerCase();
14
+ return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on';
15
+ }
16
+ function loadState() {
17
+ try {
18
+ const raw = fs.readFileSync(TELEMETRY_PATH, 'utf8');
19
+ const parsed = JSON.parse(raw);
20
+ if (parsed &&
21
+ typeof parsed === 'object' &&
22
+ 'anonymousId' in parsed &&
23
+ typeof parsed.anonymousId === 'string') {
24
+ return parsed;
25
+ }
26
+ }
27
+ catch (err) {
28
+ const e = err;
29
+ if (e.code !== 'ENOENT') {
30
+ // Fall through to fresh state.
31
+ }
32
+ }
33
+ const state = { anonymousId: randomUUID() };
34
+ try {
35
+ const dir = path.dirname(TELEMETRY_PATH);
36
+ fs.mkdirSync(dir, { recursive: true });
37
+ fs.writeFileSync(TELEMETRY_PATH, JSON.stringify(state, null, 2) + '\n', 'utf8');
38
+ }
39
+ catch {
40
+ // Best-effort persistence: if filesystem is read-only or unavailable,
41
+ // telemetry will still work with ephemeral anonymous ID
42
+ }
43
+ return state;
44
+ }
45
+ function telemetryEnabled(state) {
46
+ if (isTruthy(process.env.DO_NOT_TRACK) || isTruthy(process.env.RELAYCAST_TELEMETRY_DISABLED)) {
47
+ return false;
48
+ }
49
+ if (state.telemetryDisabled === true)
50
+ return false;
51
+ return true;
52
+ }
53
+ function getPostHogHost() {
54
+ const configured = process.env.POSTHOG_HOST ??
55
+ process.env.RELAYCAST_POSTHOG_HOST ??
56
+ DEFAULT_POSTHOG_HOST;
57
+ return configured.endsWith('/') ? configured.slice(0, -1) : configured;
58
+ }
59
+ function getPostHogKey() {
60
+ return process.env.POSTHOG_API_KEY ??
61
+ process.env.RELAYCAST_POSTHOG_KEY ??
62
+ process.env.POSTHOG_KEY ??
63
+ DEFAULT_POSTHOG_KEY;
64
+ }
65
+ function postJson(urlString, payload) {
66
+ return new Promise((resolve) => {
67
+ let resolved = false;
68
+ const finish = () => {
69
+ if (resolved)
70
+ return;
71
+ resolved = true;
72
+ resolve();
73
+ };
74
+ try {
75
+ const url = new URL(urlString);
76
+ const body = JSON.stringify(payload);
77
+ const client = url.protocol === 'http:' ? http : https;
78
+ const req = client.request({
79
+ hostname: url.hostname,
80
+ port: url.port ? parseInt(url.port, 10) : undefined,
81
+ path: `${url.pathname}${url.search}`,
82
+ method: 'POST',
83
+ headers: {
84
+ 'content-type': 'application/json',
85
+ 'content-length': Buffer.byteLength(body),
86
+ },
87
+ }, (res) => {
88
+ res.resume();
89
+ res.on('end', finish);
90
+ res.on('error', finish);
91
+ });
92
+ req.on('error', finish);
93
+ req.setTimeout(1000, () => {
94
+ req.destroy();
95
+ finish();
96
+ });
97
+ req.write(body);
98
+ req.end();
99
+ }
100
+ catch {
101
+ finish();
102
+ }
103
+ });
104
+ }
105
+ export function createMcpTelemetry(version = 'unknown') {
106
+ const state = loadState();
107
+ const sessionId = randomUUID();
108
+ const pending = new Set();
109
+ const distinctId = process.env.RELAYCAST_TELEMETRY_DISTINCT_ID || state.anonymousId;
110
+ const capture = (event, properties = {}) => {
111
+ if (!telemetryEnabled(state))
112
+ return;
113
+ const payload = {
114
+ api_key: getPostHogKey(),
115
+ event,
116
+ distinct_id: distinctId,
117
+ properties: {
118
+ surface: 'mcp',
119
+ mcp_version: version,
120
+ session_id: sessionId,
121
+ node_version: process.version,
122
+ platform: process.platform,
123
+ arch: process.arch,
124
+ ...properties,
125
+ },
126
+ };
127
+ const promise = postJson(`${getPostHogHost()}/capture/`, payload);
128
+ pending.add(promise);
129
+ void promise.finally(() => pending.delete(promise));
130
+ };
131
+ const flush = async (timeoutMs = 300) => {
132
+ const tasks = Array.from(pending);
133
+ if (tasks.length === 0)
134
+ return;
135
+ await Promise.race([
136
+ Promise.allSettled(tasks).then(() => undefined),
137
+ new Promise((resolve) => {
138
+ const timer = setTimeout(resolve, timeoutMs);
139
+ timer.unref?.();
140
+ }),
141
+ ]);
142
+ };
143
+ return { capture, flush };
144
+ }
145
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { type McpServerOptions } from './server.js';
6
6
  export declare function startStdio(options: McpServerOptions): Promise<void>;
7
7
  /**
8
8
  * Create Express middleware for HTTP+SSE transport (multi-agent).
9
- * Each connecting client gets its own session with isolated state.
9
+ * Each connecting client gets its own session with isolated state and telemetry.
10
10
  */
11
11
  export declare function createHttpHandler(baseOptions: McpServerOptions): {
12
12
  handleRequest: (req: import("node:http").IncomingMessage, res: import("node:http").ServerResponse) => Promise<void>;
@@ -1 +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"}
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;yBAGpD,OAAO,WAAW,EAAE,eAAe,OACnC,OAAO,WAAW,EAAE,cAAc;EA4C5C"}
@@ -1,24 +1,25 @@
1
1
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
2
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
- import { createRelayMcpServer } from './server.js';
3
+ import { createRelayMcpServer, MCP_VERSION } from './server.js';
4
4
  import { randomUUID } from 'node:crypto';
5
+ import { createMcpTelemetry } from './telemetry.js';
5
6
  /**
6
7
  * Start MCP server with stdio transport (single agent).
7
8
  * Reads from stdin, writes to stdout.
8
9
  */
9
10
  export async function startStdio(options) {
10
- const mcpServer = createRelayMcpServer(options);
11
+ const mcpServer = createRelayMcpServer({ ...options, telemetryTransport: 'stdio' });
11
12
  const transport = new StdioServerTransport();
12
13
  await mcpServer.connect(transport);
13
14
  }
14
15
  /**
15
16
  * Session map for HTTP transport (multi-agent).
16
- * Each session gets its own MCP server + transport instance.
17
+ * Each session gets its own MCP server + transport + telemetry instance.
17
18
  */
18
19
  const sessions = new Map();
19
20
  /**
20
21
  * Create Express middleware for HTTP+SSE transport (multi-agent).
21
- * Each connecting client gets its own session with isolated state.
22
+ * Each connecting client gets its own session with isolated state and telemetry.
22
23
  */
23
24
  export function createHttpHandler(baseOptions) {
24
25
  return {
@@ -30,11 +31,16 @@ export function createHttpHandler(baseOptions) {
30
31
  await session.transport.handleRequest(req, res);
31
32
  return;
32
33
  }
33
- // New session — create fresh MCP server + transport
34
+ // New session — create fresh MCP server + transport + telemetry
35
+ const telemetry = createMcpTelemetry(MCP_VERSION);
34
36
  const transport = new StreamableHTTPServerTransport({
35
37
  sessionIdGenerator: () => randomUUID(),
36
38
  });
37
- const mcpServer = createRelayMcpServer(baseOptions);
39
+ const mcpServer = createRelayMcpServer({
40
+ ...baseOptions,
41
+ telemetryTransport: 'http',
42
+ telemetry,
43
+ });
38
44
  transport.onclose = () => {
39
45
  if (transport.sessionId) {
40
46
  sessions.delete(transport.sessionId);
@@ -43,6 +49,11 @@ export function createHttpHandler(baseOptions) {
43
49
  await mcpServer.connect(transport);
44
50
  if (transport.sessionId) {
45
51
  sessions.set(transport.sessionId, { transport });
52
+ telemetry.capture('relaycast_mcp_http_session_started', {
53
+ source_surface: 'mcp',
54
+ transport: 'http',
55
+ mcp_transport_session_id: transport.sessionId,
56
+ });
46
57
  }
47
58
  await transport.handleRequest(req, res);
48
59
  },
@@ -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,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"}
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;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,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;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;gBACjD,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;YAED,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relaycast/mcp",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -10,8 +10,8 @@
10
10
  "lint": "eslint src/"
11
11
  },
12
12
  "dependencies": {
13
- "@relaycast/sdk": "0.1.1",
14
- "@relaycast/types": "0.1.1",
13
+ "@relaycast/sdk": "0.1.3",
14
+ "@relaycast/types": "0.1.3",
15
15
  "@modelcontextprotocol/sdk": "^1.26.0",
16
16
  "express": "^5.2.1",
17
17
  "zod": "^4.3.6"