@rolexjs/mcp-server 1.5.0-dev-20260310044915 → 1.5.0-dev-20260312083443
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.js +24 -23
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
package/dist/index.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
-
import { genesis } from "@rolexjs/genesis";
|
|
5
4
|
import { localPlatform } from "@rolexjs/local-platform";
|
|
6
5
|
import { FastMCP } from "fastmcp";
|
|
7
6
|
import {
|
|
8
7
|
createRoleX,
|
|
9
|
-
detail,
|
|
10
|
-
protocol,
|
|
11
8
|
renderProductResult,
|
|
12
9
|
renderProjectResult
|
|
13
10
|
} from "rolexjs";
|
|
@@ -23,11 +20,9 @@ var McpState = class {
|
|
|
23
20
|
};
|
|
24
21
|
|
|
25
22
|
// src/index.ts
|
|
26
|
-
var rolex =
|
|
27
|
-
localPlatform(
|
|
28
|
-
|
|
29
|
-
})
|
|
30
|
-
);
|
|
23
|
+
var rolex = createRoleX({
|
|
24
|
+
platform: localPlatform()
|
|
25
|
+
});
|
|
31
26
|
var state = new McpState();
|
|
32
27
|
function paramToZod(param, required) {
|
|
33
28
|
let zodType;
|
|
@@ -76,22 +71,22 @@ function parseArgs(args) {
|
|
|
76
71
|
}
|
|
77
72
|
var executors = {
|
|
78
73
|
async inspect({ id }) {
|
|
79
|
-
return await rolex.inspect(id);
|
|
74
|
+
return await rolex.role.inspect({ id });
|
|
80
75
|
},
|
|
81
76
|
async survey({ type }) {
|
|
82
|
-
return await rolex.survey(type);
|
|
77
|
+
return await rolex.role.survey({ type });
|
|
83
78
|
},
|
|
84
79
|
async activate({ roleId }) {
|
|
85
80
|
try {
|
|
86
|
-
const role = await rolex.activate(roleId);
|
|
81
|
+
const role = await rolex.role.activate({ individual: roleId });
|
|
87
82
|
state.role = role;
|
|
88
83
|
return await role.project();
|
|
89
84
|
} catch {
|
|
90
|
-
const census = await rolex.
|
|
85
|
+
const census = await rolex.census.list();
|
|
91
86
|
throw new Error(
|
|
92
87
|
`"${roleId}" not found. Available:
|
|
93
88
|
|
|
94
|
-
${census}
|
|
89
|
+
${JSON.stringify(census)}
|
|
95
90
|
|
|
96
91
|
Try again with the correct id or alias.`
|
|
97
92
|
);
|
|
@@ -147,29 +142,35 @@ Try again with the correct id or alias.`
|
|
|
147
142
|
},
|
|
148
143
|
async direct({ command, args }) {
|
|
149
144
|
const a = parseArgs(args);
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
145
|
+
const method = command.startsWith("!") ? command.slice(1) : command;
|
|
146
|
+
const response = await rolex.rpc({
|
|
147
|
+
jsonrpc: "2.0",
|
|
148
|
+
method,
|
|
149
|
+
params: a && Object.keys(a).length > 0 ? a : void 0,
|
|
150
|
+
id: null
|
|
151
|
+
});
|
|
152
|
+
if (response.error) throw new Error(response.error.message);
|
|
153
|
+
const result = response.result;
|
|
154
154
|
if (result == null) return `${command} done.`;
|
|
155
155
|
if (typeof result === "string") return result;
|
|
156
|
-
if (
|
|
156
|
+
if (method === "project.produce") {
|
|
157
157
|
const opResult = result;
|
|
158
158
|
return renderProductResult("produce", opResult.state);
|
|
159
159
|
}
|
|
160
|
-
if (
|
|
161
|
-
const action =
|
|
160
|
+
if (method.startsWith("project.")) {
|
|
161
|
+
const action = method.slice("project.".length);
|
|
162
162
|
const opResult = result;
|
|
163
163
|
return renderProjectResult(action, opResult.state);
|
|
164
164
|
}
|
|
165
|
-
if (
|
|
166
|
-
const action =
|
|
165
|
+
if (method.startsWith("product.")) {
|
|
166
|
+
const action = method.slice("product.".length);
|
|
167
167
|
const opResult = result;
|
|
168
168
|
return renderProductResult(action, opResult.state);
|
|
169
169
|
}
|
|
170
170
|
return JSON.stringify(result, null, 2);
|
|
171
171
|
}
|
|
172
172
|
};
|
|
173
|
+
var { protocol } = rolex;
|
|
173
174
|
var server = new FastMCP({
|
|
174
175
|
name: "rolex",
|
|
175
176
|
version: "0.12.0",
|
|
@@ -182,7 +183,7 @@ for (const toolDef of protocol.tools) {
|
|
|
182
183
|
}
|
|
183
184
|
server.addTool({
|
|
184
185
|
name: toolDef.name,
|
|
185
|
-
description:
|
|
186
|
+
description: toolDef.description,
|
|
186
187
|
parameters: toZodSchema(toolDef),
|
|
187
188
|
execute: async (params) => {
|
|
188
189
|
return await executor(params);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/state.ts"],"sourcesContent":["/**\n * @rolexjs/mcp-server — individual-level MCP tools.\n *\n * Pure pass-through: all rendering happens in rolexjs.\n * MCP only translates protocol calls to API calls.\n *\n * Tool schemas are defined once in @rolexjs/core (tools)\n * and converted to Zod here for FastMCP registration.\n */\n\nimport { genesis } from \"@rolexjs/genesis\";\nimport { localPlatform } from \"@rolexjs/local-platform\";\nimport { FastMCP } from \"fastmcp\";\nimport {\n createRoleX,\n detail,\n type ParamDef,\n type ProductAction,\n type ProjectAction,\n protocol,\n renderProductResult,\n renderProjectResult,\n type State,\n type ToolDef,\n} from \"rolexjs\";\n\nimport { z } from \"zod\";\nimport { McpState } from \"./state.js\";\n\n// ========== Setup ==========\n\nconst rolex = await createRoleX(\n localPlatform({\n prototypes: [genesis],\n })\n);\nconst state = new McpState();\n\n// ========== Zod conversion ==========\n\nfunction paramToZod(param: ParamDef, required: boolean): z.ZodTypeAny {\n let zodType: z.ZodTypeAny;\n switch (param.type) {\n case \"string\":\n case \"gherkin\":\n zodType = z.string();\n break;\n case \"string[]\":\n zodType = z.array(z.string());\n break;\n case \"number\":\n zodType = z.number();\n break;\n case \"record\":\n zodType = z.record(z.unknown());\n break;\n default:\n zodType = z.unknown();\n }\n zodType = zodType.describe(param.description);\n if (!required) zodType = zodType.optional();\n return zodType;\n}\n\nfunction toZodSchema(def: ToolDef): z.ZodTypeAny {\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, param] of Object.entries(def.params)) {\n shape[key] = paramToZod(param, param.required);\n }\n const schema = z.object(shape);\n return schema;\n}\n\n// ========== Tool execution ==========\n\n/** Defensive args parsing — some AI models serialize args as a JSON string instead of an object. */\nfunction parseArgs(args: unknown): Record<string, unknown> | undefined {\n if (args == null) return undefined;\n if (typeof args === \"object\") return args as Record<string, unknown>;\n if (typeof args === \"string\") {\n try {\n const parsed = JSON.parse(args);\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // not valid JSON, ignore\n }\n }\n return undefined;\n}\n\ntype ToolExecutor = (params: Record<string, unknown>) => Promise<string>;\n\nconst executors: Record<string, ToolExecutor> = {\n async inspect({ id }) {\n return await rolex.inspect(id as string);\n },\n\n async survey({ type }) {\n return await rolex.survey(type as string | undefined);\n },\n\n async activate({ roleId }) {\n try {\n const role = await rolex.activate(roleId as string);\n state.role = role;\n return await role.project();\n } catch {\n const census = await rolex.direct<string>(\"!census.list\");\n throw new Error(\n `\"${roleId}\" not found. Available:\\n\\n${census}\\n\\nTry again with the correct id or alias.`\n );\n }\n },\n\n async focus({ id }) {\n return await state.requireRole().focus(id as string | undefined);\n },\n\n async want({ id, goal }) {\n return await state.requireRole().want(goal as string, id as string);\n },\n\n async plan({ id, plan, after, fallback }) {\n return await state\n .requireRole()\n .plan(\n plan as string,\n id as string,\n after as string | undefined,\n fallback as string | undefined\n );\n },\n\n async todo({ id, task }) {\n return await state.requireRole().todo(task as string, id as string);\n },\n\n async finish({ id, encounter }) {\n return await state.requireRole().finish(id as string, encounter as string | undefined);\n },\n\n async complete({ id, encounter }) {\n return await state\n .requireRole()\n .complete(id as string | undefined, encounter as string | undefined);\n },\n\n async abandon({ id, encounter }) {\n return await state\n .requireRole()\n .abandon(id as string | undefined, encounter as string | undefined);\n },\n\n async reflect({ ids, id, experience }) {\n return await state\n .requireRole()\n .reflect(ids as string[], experience as string | undefined, id as string);\n },\n\n async realize({ ids, id, principle }) {\n return await state\n .requireRole()\n .realize(ids as string[], principle as string | undefined, id as string);\n },\n\n async master({ ids, id, procedure }) {\n return await state\n .requireRole()\n .master(procedure as string, id as string, ids as string[] | undefined);\n },\n\n async forget({ id }) {\n return await state.requireRole().forget(id as string);\n },\n\n async skill({ locator }) {\n return await state.requireRole().skill(locator as string);\n },\n\n async use({ command, args }) {\n const a = parseArgs(args);\n const result = await state\n .requireRole()\n .use(command as string, a && Object.keys(a).length > 0 ? a : undefined);\n if (result == null) return `${command} done.`;\n if (typeof result === \"string\") return result;\n return JSON.stringify(result, null, 2);\n },\n\n async direct({ command, args }) {\n const a = parseArgs(args);\n const result = await rolex.direct(\n command as string,\n a && Object.keys(a).length > 0 ? a : undefined\n );\n if (result == null) return `${command} done.`;\n if (typeof result === \"string\") return result;\n if ((command as string) === \"!project.produce\") {\n const opResult = result as { state: State };\n return renderProductResult(\"produce\" as ProductAction, opResult.state);\n }\n if ((command as string).startsWith(\"!project.\")) {\n const action = (command as string).slice(\"!project.\".length) as ProjectAction;\n const opResult = result as { state: State };\n return renderProjectResult(action, opResult.state);\n }\n if ((command as string).startsWith(\"!product.\")) {\n const action = (command as string).slice(\"!product.\".length) as ProductAction;\n const opResult = result as { state: State };\n return renderProductResult(action, opResult.state);\n }\n return JSON.stringify(result, null, 2);\n },\n};\n\n// ========== Server ==========\n\nconst server = new FastMCP({\n name: \"rolex\",\n version: \"0.12.0\",\n instructions: protocol.instructions,\n});\n\n// Register all tools from unified schema\nfor (const toolDef of protocol.tools) {\n const executor = executors[toolDef.name];\n if (!executor) {\n throw new Error(`No executor for tool \"${toolDef.name}\"`);\n }\n\n server.addTool({\n name: toolDef.name,\n description: detail(toolDef.name),\n parameters: toZodSchema(toolDef),\n execute: async (params) => {\n return await executor(params as Record<string, unknown>);\n },\n });\n}\n\n// ========== Start ==========\n\nserver.start({\n transportType: \"stdio\",\n});\n","/**\n * McpState — thin session holder for the MCP server.\n *\n * Holds the active Role handle. All business logic (state tracking,\n * cognitive hints, encounter/experience registries) lives in Role + RoleContext.\n */\nimport type { Role } from \"rolexjs\";\n\nexport class McpState {\n role: Role | null = null;\n\n requireRole(): Role {\n if (!this.role) throw new Error(\"No active role. Call activate first.\");\n return this.role;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/state.ts"],"sourcesContent":["/**\n * @rolexjs/mcp-server — individual-level MCP tools.\n *\n * Pure pass-through: all rendering happens in rolexjs.\n * MCP only translates protocol calls to API calls.\n *\n * Tool schemas are defined once in @rolexjs/core (tools)\n * and converted to Zod here for FastMCP registration.\n */\n\nimport { localPlatform } from \"@rolexjs/local-platform\";\nimport { FastMCP } from \"fastmcp\";\nimport {\n createRoleX,\n type ParamDef,\n type ProductAction,\n type ProjectAction,\n renderProductResult,\n renderProjectResult,\n type State,\n type ToolDef,\n} from \"rolexjs\";\n\nimport { z } from \"zod\";\nimport { McpState } from \"./state.js\";\n\n// ========== Setup ==========\n\nconst rolex = createRoleX({\n platform: localPlatform(),\n});\nconst state = new McpState();\n\n// ========== Zod conversion ==========\n\nfunction paramToZod(param: ParamDef, required: boolean): z.ZodTypeAny {\n let zodType: z.ZodTypeAny;\n switch (param.type) {\n case \"string\":\n case \"gherkin\":\n zodType = z.string();\n break;\n case \"string[]\":\n zodType = z.array(z.string());\n break;\n case \"number\":\n zodType = z.number();\n break;\n case \"record\":\n zodType = z.record(z.unknown());\n break;\n default:\n zodType = z.unknown();\n }\n zodType = zodType.describe(param.description);\n if (!required) zodType = zodType.optional();\n return zodType;\n}\n\nfunction toZodSchema(def: ToolDef): z.ZodTypeAny {\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, param] of Object.entries(def.params)) {\n shape[key] = paramToZod(param, param.required);\n }\n const schema = z.object(shape);\n return schema;\n}\n\n// ========== Tool execution ==========\n\n/** Defensive args parsing — some AI models serialize args as a JSON string instead of an object. */\nfunction parseArgs(args: unknown): Record<string, unknown> | undefined {\n if (args == null) return undefined;\n if (typeof args === \"object\") return args as Record<string, unknown>;\n if (typeof args === \"string\") {\n try {\n const parsed = JSON.parse(args);\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // not valid JSON, ignore\n }\n }\n return undefined;\n}\n\ntype ToolExecutor = (params: Record<string, unknown>) => Promise<string>;\n\nconst executors: Record<string, ToolExecutor> = {\n async inspect({ id }) {\n return await rolex.role.inspect({ id: id as string });\n },\n\n async survey({ type }) {\n return await rolex.role.survey({ type: type as string | undefined });\n },\n\n async activate({ roleId }) {\n try {\n const role = await rolex.role.activate({ individual: roleId as string });\n state.role = role;\n return await role.project();\n } catch {\n const census = await rolex.census.list();\n throw new Error(\n `\"${roleId}\" not found. Available:\\n\\n${JSON.stringify(census)}\\n\\nTry again with the correct id or alias.`\n );\n }\n },\n\n async focus({ id }) {\n return await state.requireRole().focus(id as string | undefined);\n },\n\n async want({ id, goal }) {\n return await state.requireRole().want(goal as string, id as string);\n },\n\n async plan({ id, plan, after, fallback }) {\n return await state\n .requireRole()\n .plan(\n plan as string,\n id as string,\n after as string | undefined,\n fallback as string | undefined\n );\n },\n\n async todo({ id, task }) {\n return await state.requireRole().todo(task as string, id as string);\n },\n\n async finish({ id, encounter }) {\n return await state.requireRole().finish(id as string, encounter as string | undefined);\n },\n\n async complete({ id, encounter }) {\n return await state\n .requireRole()\n .complete(id as string | undefined, encounter as string | undefined);\n },\n\n async abandon({ id, encounter }) {\n return await state\n .requireRole()\n .abandon(id as string | undefined, encounter as string | undefined);\n },\n\n async reflect({ ids, id, experience }) {\n return await state\n .requireRole()\n .reflect(ids as string[], experience as string | undefined, id as string);\n },\n\n async realize({ ids, id, principle }) {\n return await state\n .requireRole()\n .realize(ids as string[], principle as string | undefined, id as string);\n },\n\n async master({ ids, id, procedure }) {\n return await state\n .requireRole()\n .master(procedure as string, id as string, ids as string[] | undefined);\n },\n\n async forget({ id }) {\n return await state.requireRole().forget(id as string);\n },\n\n async skill({ locator }) {\n return await state.requireRole().skill(locator as string);\n },\n\n async use({ command, args }) {\n const a = parseArgs(args);\n const result = await state\n .requireRole()\n .use(command as string, a && Object.keys(a).length > 0 ? a : undefined);\n if (result == null) return `${command} done.`;\n if (typeof result === \"string\") return result;\n return JSON.stringify(result, null, 2);\n },\n\n async direct({ command, args }) {\n const a = parseArgs(args);\n // Strip \"!\" prefix for JSON-RPC method name\n const method = (command as string).startsWith(\"!\")\n ? (command as string).slice(1)\n : (command as string);\n const response = await rolex.rpc({\n jsonrpc: \"2.0\",\n method,\n params: a && Object.keys(a).length > 0 ? a : undefined,\n id: null,\n });\n if (response.error) throw new Error(response.error.message);\n const result = response.result;\n if (result == null) return `${command} done.`;\n if (typeof result === \"string\") return result;\n if (method === \"project.produce\") {\n const opResult = result as { state: State };\n return renderProductResult(\"produce\" as ProductAction, opResult.state);\n }\n if (method.startsWith(\"project.\")) {\n const action = method.slice(\"project.\".length) as ProjectAction;\n const opResult = result as { state: State };\n return renderProjectResult(action, opResult.state);\n }\n if (method.startsWith(\"product.\")) {\n const action = method.slice(\"product.\".length) as ProductAction;\n const opResult = result as { state: State };\n return renderProductResult(action, opResult.state);\n }\n return JSON.stringify(result, null, 2);\n },\n};\n\n// ========== Server ==========\n\nconst { protocol } = rolex;\n\nconst server = new FastMCP({\n name: \"rolex\",\n version: \"0.12.0\",\n instructions: protocol.instructions,\n});\n\n// Register all tools from unified schema\nfor (const toolDef of protocol.tools) {\n const executor = executors[toolDef.name];\n if (!executor) {\n throw new Error(`No executor for tool \"${toolDef.name}\"`);\n }\n\n server.addTool({\n name: toolDef.name,\n description: toolDef.description,\n parameters: toZodSchema(toolDef),\n execute: async (params) => {\n return await executor(params as Record<string, unknown>);\n },\n });\n}\n\n// ========== Start ==========\n\nserver.start({\n transportType: \"stdio\",\n});\n","/**\n * McpState — thin session holder for the MCP server.\n *\n * Holds the active Role handle. All business logic (state tracking,\n * cognitive hints, encounter/experience registries) lives in Role + RoleContext.\n */\nimport type { Role } from \"rolexjs\";\n\nexport class McpState {\n role: Role | null = null;\n\n requireRole(): Role {\n if (!this.role) throw new Error(\"No active role. Call activate first.\");\n return this.role;\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rolexjs/mcp-server",
|
|
3
|
-
"version": "1.5.0-dev-
|
|
3
|
+
"version": "1.5.0-dev-20260312083443",
|
|
4
4
|
"description": "MCP server for Rolex — expose RDD role management as MCP tools",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"rolex",
|
|
@@ -41,9 +41,8 @@
|
|
|
41
41
|
"clean": "rm -rf dist"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"rolexjs": "1.5.0-dev-
|
|
45
|
-
"@rolexjs/local-platform": "1.5.0-dev-
|
|
46
|
-
"@rolexjs/genesis": "1.5.0-dev-20260310044915",
|
|
44
|
+
"rolexjs": "1.5.0-dev-20260312083443",
|
|
45
|
+
"@rolexjs/local-platform": "1.5.0-dev-20260312083443",
|
|
47
46
|
"fastmcp": "^3.0.0",
|
|
48
47
|
"zod": "^3.25.0"
|
|
49
48
|
},
|