Lines 1-37javascript
2// Rally Project Brain MCP server — the actual "works with any IDE" answer.
3// Any MCP-compatible client (Claude Code, Cursor, VS Code Copilot agent
4// mode, Windsurf, ...) can connect to this over stdio and call these tools
5// directly, with zero per-tool hook/extension work on our side. This is
6// lower-fidelity than a native hooks integration (the agent has to choose to
7// call these tools; nothing observes it passively), but it's the one
8// mechanism that isn't tied to a single vendor's extensibility model.
9import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
11import { z } from "zod";
12import { createInterface } from "node:readline/promises";
13import { readFile, writeFile, mkdir, stat } from "node:fs/promises";
14import path from "node:path";
15import os from "node:os";
16import { parse as parseToml } from "smol-toml";
18// Embedded Claude Code hook file contents, base64-encoded to avoid any
19// escaping hazard from the hooks' own template-literal syntax. Generated
HighBase64 Obscured Url
Source decodes a Base64-obscured HTTP endpoint at runtime.
index.mjsView on unpkg · L17 20// from Rally_Backend/.claude/hooks/*.mjs — if you edit a hook there, re-run
21// the generator (see that directory's own copy) and paste the new object in.
22const CLAUDE_CODE_HOOKS_B64 = {
23 "rally-common.mjs": "Ly8gU2hhcmVkIGhlbHBlcnMgZm9yIHRoZSBSYWxseSBQcm9qZWN0IEJyYWluIGhvb2sgc2NyaXB0cy4gRXZlcnkgaG9vayBpcwovLyBkZWxpYmVyYXRlbHkgZmFpbC1vcGVuOiBpZiB0aGUgYmFja2VuZCBpcyBkb3duIG9yIG1pc2NvbmZpZ3VyZWQsIGhvb2tzIGxvZwovLyB0byBzdGRlcnIgYW5kIGV4aXQgMCByYXRoZXIgdGhhbiBpbnRlcnJ1cHQgdGhlIGFjdHVhbCBjb2Rpbmcgc2Vzc2lvbi4KaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jLCBleGlzdHNTeW5jLCBta2RpclN5bmMsIHVubGlua1N5bmMgfSBmcm9tICJub2RlOmZzIjsKaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCBvcyBmcm9tICJub2RlOm9zIjsKCmV4cG9ydCBjb25zdCBCQVNFX1VSTCA9IHByb2Nlc3MuZW52LlJBTExZX0JBQ0tFTkRfVVJMIHx8I ...
24 "session-start.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQovLyBTZXNzaW9uU3RhcnQ6IHJlZ2lzdGVyIGFuIGFnZW50IGpvYiBmb3IgdGhpcyBDbGF1ZGUgQ29kZSBzZXNzaW9uIGFuZCBoYW5kCi8vIGJhY2sgdGhlIHByb2plY3QncyBzaGFyZWQtbWVtb3J5IGJyaWVmIGFzIGFkZGl0aW9uYWwgY29udGV4dCwgc28gdGhlCi8vIHNlc3Npb24gc3RhcnRzIGFscmVhZHkgYXdhcmUgb2Ygb3BlbiB0YXNrcy9pbnZlc3RpZ2F0aW9ucy4KaW1wb3J0IHsgcmVhZFN0ZGluSnNvbiwgd3JpdGVTdGF0ZSwgYXBpLCBydW5Ib29rLCBQUk9KRUNUX0lELCBBQ1RPUl9JRCB9IGZyb20gIi4vcmFsbHktY29tbW9uLm1qcyI7CgpydW5Ib29rKGFzeW5jICgpID0+IHsKICBjb25zdCBpbnB1dCA9IGF3YWl0IHJlYWRTdGRpbkpzb24oKTsKICBpZiAoIVBST0pFQ1RfSUQgfHwgIUFDVE9SX0lEKSByZXR1cm47 ...
25 "user-prompt-submit.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQovLyBVc2VyUHJvbXB0U3VibWl0OiBiZWZvcmUgZWFjaCB0dXJuLCBjaGVjayB3aGV0aGVyIGFueW9uZSBzZW50IGEgc3RlZXJpbmcKLy8gbWVzc2FnZSB2aWEgdGhlIFByb2plY3QgQnJhaW4gZGFzaGJvYXJkL1plZCBwYW5lbCBzaW5jZSB0aGUgbGFzdCB0dXJuLCBhbmQKLy8gaWYgc28sIGZvbGQgaXQgaW50byBjb250ZXh0LiBUaGlzIGlzIHdoYXQgbWFrZXMgY2xhaW0vbWVzc2FnZXMgbW9yZSB0aGFuCi8vIGEgd3JpdGUtb25seSBsb2cg4oCUIHRoZSBhZ2VudCBhY3R1YWxseSBzZWVzIGl0LiBBbHNvIHJlcG9ydHMgdGhlIGh1bWFuJ3MKLy8gYWN0dWFsIHByb21wdCB0ZXh0IGFzIGEgInVzZXIiIHRyYW5zY3JpcHQgdHVybiDigJQgdGhlIGdyb3VuZC10cnV0aAovLyBjb3VudGVycGFydCB0byByZXBvcnRfdHVybid ...
26 "post-tool-use.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQovLyBQb3N0VG9vbFVzZSAobWF0Y2hlcjogKik6IGxvZyByZWFsIGZpbGUgZWRpdHMgYW5kIGNvbW1hbmRzIHRvIFByb2plY3QKLy8gQnJhaW4ncyBnZW5lcmljIGZlZWQgKHRlcnNlLCBmb3IgdGhlICJMaXZlIGZlZWQiIHBhbmVsKSwgYW5kIHNlcGFyYXRlbHkKLy8gcmVwb3J0IGV2ZXJ5IHRvb2wgY2FsbCBhcyBhIGZ1bGwtZmlkZWxpdHkgdHVybiAodW50cnVuY2F0ZWQgdG9vbF9uYW1lICsKLy8gdG9vbF9pbnB1dCwgcGx1cyB0aGUgdG9vbF9yZXNwb25zZSBpZiBwcmVzZW50KSBzbyBpdCByZW5kZXJzIGluIHRoZSBzYW1lCi8vIHRyYW5zY3JpcHQgdmlldyBhIHNlbGYtcmVwb3J0aW5nIGFnZW50J3MgcmVwb3J0X3R1cm4gY2FsbHMgZG8uIFRoaXMgaXMgdGhlCi8vIGdyb3VuZC10cnV0aCBwYXRoOiByZWFsIHRvb2xfaW5w ...
27 "session-end.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQovLyBTZXNzaW9uRW5kOiBtYXJrIHRoaXMgc2Vzc2lvbidzIGFnZW50IGpvYiBkb25lLCByZXBvcnQgaXRzIG93bmVyIHNlc3Npb24KLy8gY2xvc2VkIChzbyBhIGRpZmZlcmVudCBhY3RvciBtYXkgY2xhaW0gaXQgd2l0aG91dCBuZWVkaW5nIHRoaXMgb25lIHRvCi8vIGNvbWUgYmFjayBhbmQgZXhwbGljaXRseSByZWxlYXNlIGl0KSwgYW5kIGNsZWFuIHVwIGxvY2FsIHN0YXRlLgppbXBvcnQgeyByZWFkU3RkaW5Kc29uLCByZWFkU3RhdGUsIGNsZWFyU3RhdGUsIGFwaSwgcnVuSG9vaywgQUNUT1JfSUQgfSBmcm9tICIuL3JhbGx5LWNvbW1vbi5tanMiOwoKcnVuSG9vayhhc3luYyAoKSA9PiB7CiAgY29uc3QgaW5wdXQgPSBhd2FpdCByZWFkU3RkaW5Kc29uKCk7CiAgaWYgKCFBQ1RPUl9JRCkgcmV0dXJuOwoKICBjb25zdCBzdG ...
30// Picks the mcpServers key for this actor within an existing (possibly
31// empty) servers object, instead of always using a single fixed
32// "rally-project-brain" key. That fixed-key approach broke multi-agent
33// setups: connecting a second agent in the same directory silently
34// overwrote the first one's entry, and if the first agent's session ever
35// restarted, it would reload and start reporting to Rally *as the second
36// agent's identity* — a real correctness bug, not just a UX rough edge.
Long lines were clipped for display.