@x12i/made-easy-mcp 0.0.0-stage → 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.
- package/LICENSE +21 -0
- package/README.md +38 -2
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -0
- package/dist/http.d.ts +16 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +57 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +165 -0
- package/dist/server.js.map +1 -0
- package/dist/stdio.d.ts +12 -0
- package/dist/stdio.d.ts.map +1 -0
- package/dist/stdio.js +47 -0
- package/dist/stdio.js.map +1 -0
- package/package.json +51 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 x12i
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,39 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @x12i/made-easy-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
An MCP server for **Made Easy**, so an agent can scaffold, validate, build and release guides. Tools mirror the HTTP API and call the same service.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install -g @x12i/made-easy-mcp
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Register it with an MCP client over stdio:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"mcpServers": {
|
|
14
|
+
"made-easy": { "command": "made-easy-mcp", "args": ["--data", "./.made-easy"] }
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or serve it over HTTP from `@x12i/made-easy-server` at `/mcp` (stateless, bearer token).
|
|
20
|
+
|
|
21
|
+
## Tools
|
|
22
|
+
|
|
23
|
+
All names start with `made_easy_`.
|
|
24
|
+
|
|
25
|
+
| Tool | Purpose |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| `list_guide_recipes`, `get_guide_recipe` | Discover recipes |
|
|
28
|
+
| `create_guide` | Scaffold a guide and store revision 1 |
|
|
29
|
+
| `list_guides`, `read_guide_files`, `write_guide_files` | Work with stored guides (pass `expectedRevision` when writing) |
|
|
30
|
+
| `validate_guide`, `preview_guide` | Located diagnostics; render one track |
|
|
31
|
+
| `build_guide`, `get_guide_job`, `cancel_guide_job` | Run and follow a build job |
|
|
32
|
+
| `approve_guide_revision`, `release_guide`, `list_guide_releases` | Approve an exact revision and publish it |
|
|
33
|
+
| `draft_guide`, `apply_guide_draft` | Only when a draft provider is configured (`MADE_EASY_DRAFT_ENDPOINT`, `MADE_EASY_DRAFT_MODEL`, `MADE_EASY_DRAFT_API_KEY`) |
|
|
34
|
+
|
|
35
|
+
A succeeded job lists its files as `resource_link` outputs, readable at `made-easy://jobs/{jobId}/artifacts/{artifactId}`. Failures are tool errors with stable codes (`REVISION_MISMATCH`, `FORBIDDEN`, `NOT_FOUND`, ...), never silent successes.
|
|
36
|
+
|
|
37
|
+
In stdio mode the local user holds every role. Narrow it with `--roles author`. Path sources are refused unless you pass `--allow-paths`.
|
|
38
|
+
|
|
39
|
+
MIT © x12i · [Repository](https://github.com/x12i/made-easy)
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
ADDED
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,CAAC,QAAQ,GAAG,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import type { MadeEasyService, Principal } from '@x12i/made-easy-service';
|
|
3
|
+
export interface McpHttpOptions {
|
|
4
|
+
service: MadeEasyService;
|
|
5
|
+
/** Resolve the bearer token to a Principal; return undefined to answer 401. */
|
|
6
|
+
authenticate: (req: IncomingMessage) => Principal | undefined | Promise<Principal | undefined>;
|
|
7
|
+
/** Route path. Default "/mcp". */
|
|
8
|
+
path?: string;
|
|
9
|
+
maxBodyBytes?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Stateless streamable-HTTP handler. Every request is authenticated, gets a fresh server bound to that
|
|
13
|
+
* caller's Principal, and shares no state with other callers. Returns false when the path is not MCP.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createMcpHttpHandler(options: McpHttpOptions): (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
|
|
16
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjE,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAG1E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,eAAe,CAAC;IACzB,+EAA+E;IAC/E,YAAY,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAC/F,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CA8C7H"}
|
package/dist/http.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
2
|
+
import { VERSION } from '@x12i/made-easy';
|
|
3
|
+
import { createMcpServer } from './server.js';
|
|
4
|
+
/**
|
|
5
|
+
* Stateless streamable-HTTP handler. Every request is authenticated, gets a fresh server bound to that
|
|
6
|
+
* caller's Principal, and shares no state with other callers. Returns false when the path is not MCP.
|
|
7
|
+
*/
|
|
8
|
+
export function createMcpHttpHandler(options) {
|
|
9
|
+
const path = options.path ?? '/mcp';
|
|
10
|
+
const limit = options.maxBodyBytes ?? 10 * 1024 * 1024;
|
|
11
|
+
return async (req, res) => {
|
|
12
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
13
|
+
if (url.pathname !== path)
|
|
14
|
+
return false;
|
|
15
|
+
const principal = await options.authenticate(req);
|
|
16
|
+
if (!principal) {
|
|
17
|
+
res.writeHead(401, { 'content-type': 'application/json', 'www-authenticate': 'Bearer' });
|
|
18
|
+
res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32001, message: 'A valid bearer token is required.' }, id: null }));
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (req.method !== 'POST') {
|
|
22
|
+
res.writeHead(405, { allow: 'POST', 'content-type': 'application/json' });
|
|
23
|
+
res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32000, message: 'This endpoint is stateless; use POST.' }, id: null }));
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
const chunks = [];
|
|
27
|
+
let size = 0;
|
|
28
|
+
for await (const chunk of req) {
|
|
29
|
+
size += chunk.length;
|
|
30
|
+
if (size > limit) {
|
|
31
|
+
res.writeHead(413, { 'content-type': 'application/json' });
|
|
32
|
+
res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32000, message: 'The request is too large.' }, id: null }));
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
chunks.push(chunk);
|
|
36
|
+
}
|
|
37
|
+
let body;
|
|
38
|
+
try {
|
|
39
|
+
body = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
res.writeHead(400, { 'content-type': 'application/json' });
|
|
43
|
+
res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32700, message: 'Parse error' }, id: null }));
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
const server = createMcpServer(options.service, principal, { version: VERSION });
|
|
47
|
+
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true });
|
|
48
|
+
res.on('close', () => {
|
|
49
|
+
void transport.close();
|
|
50
|
+
void server.close();
|
|
51
|
+
});
|
|
52
|
+
await server.connect(transport);
|
|
53
|
+
await transport.handleRequest(req, res, body);
|
|
54
|
+
return true;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAuB,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { type MadeEasyService, type Principal } from '@x12i/made-easy-service';
|
|
3
|
+
export declare const TOOL_PREFIX = "made_easy_";
|
|
4
|
+
export declare const RESOURCE_SCHEME = "made-easy";
|
|
5
|
+
/**
|
|
6
|
+
* Create an MCP server bound to one Principal. Tools mirror the HTTP API and call the same service,
|
|
7
|
+
* so tenant isolation, roles, idempotency and release gates are identical.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createMcpServer(service: MadeEasyService, principal: Principal, info: {
|
|
10
|
+
version: string;
|
|
11
|
+
}): McpServer;
|
|
12
|
+
//# 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,EAAoB,MAAM,yCAAyC,CAAC;AAGtF,OAAO,EAAgC,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE7G,eAAO,MAAM,WAAW,eAAe,CAAC;AACxC,eAAO,MAAM,eAAe,cAAc,CAAC;AAsD3C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAmOpH"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { MadeEasyError, artifactIdForPath } from '@x12i/made-easy';
|
|
4
|
+
import { ServiceError } from '@x12i/made-easy-service';
|
|
5
|
+
export const TOOL_PREFIX = 'made_easy_';
|
|
6
|
+
export const RESOURCE_SCHEME = 'made-easy';
|
|
7
|
+
const ok = (data, links = [], summary) => ({
|
|
8
|
+
content: [{ type: 'text', text: summary ?? JSON.stringify(data, null, 2) }, ...links],
|
|
9
|
+
structuredContent: data,
|
|
10
|
+
});
|
|
11
|
+
function fail(e) {
|
|
12
|
+
let error;
|
|
13
|
+
if (e instanceof ServiceError)
|
|
14
|
+
error = { code: e.code, message: e.message, ...(e.diagnostics ? { diagnostics: e.diagnostics } : {}) };
|
|
15
|
+
else if (e instanceof MadeEasyError)
|
|
16
|
+
error = { code: e.code, message: e.message, diagnostics: e.diagnostics };
|
|
17
|
+
else if (e.name === 'ZodError')
|
|
18
|
+
error = { code: 'INVALID_REQUEST', message: e.message };
|
|
19
|
+
else {
|
|
20
|
+
process.stderr.write(`[made-easy-mcp] ${e.stack ?? e}\n`);
|
|
21
|
+
error = { code: 'INTERNAL_ERROR', message: 'The tool could not complete the request.' };
|
|
22
|
+
}
|
|
23
|
+
return { isError: true, content: [{ type: 'text', text: `${error.code}: ${error.message}` }], structuredContent: { error } };
|
|
24
|
+
}
|
|
25
|
+
const artifactUri = (jobId, artifactId) => `${RESOURCE_SCHEME}://jobs/${jobId}/artifacts/${encodeURIComponent(artifactId)}`;
|
|
26
|
+
function jobLinks(job) {
|
|
27
|
+
return job.artifacts.map((a) => ({
|
|
28
|
+
type: 'resource_link',
|
|
29
|
+
uri: artifactUri(job.id, a.id || artifactIdForPath(a.path)),
|
|
30
|
+
name: a.path,
|
|
31
|
+
mimeType: a.mediaType,
|
|
32
|
+
description: `${a.size} bytes, sha256 ${a.sha256.slice(0, 19)}`,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
const jobSummary = (job) => {
|
|
36
|
+
const { tenantId: _t, callerId: _c, request: _r, fence: _f, leaseExpiresAt: _l, ...rest } = job;
|
|
37
|
+
return rest;
|
|
38
|
+
};
|
|
39
|
+
const SourceShape = {
|
|
40
|
+
guideId: z.string().optional().describe('A stored guide. Preferred.'),
|
|
41
|
+
revision: z.string().optional().describe('A specific revision of the stored guide (default: head).'),
|
|
42
|
+
files: z.record(z.string(), z.string()).optional().describe('Inline bundle: relative path -> UTF-8 text. Use instead of guideId.'),
|
|
43
|
+
};
|
|
44
|
+
function sourceOf(a) {
|
|
45
|
+
if (a.guideId)
|
|
46
|
+
return { kind: 'guide', guideId: a.guideId, revision: a.revision };
|
|
47
|
+
if (a.files)
|
|
48
|
+
return { kind: 'files', files: a.files };
|
|
49
|
+
throw new ServiceError(400, 'INVALID_REQUEST', 'Provide guideId (a stored guide) or files (an inline bundle).');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create an MCP server bound to one Principal. Tools mirror the HTTP API and call the same service,
|
|
53
|
+
* so tenant isolation, roles, idempotency and release gates are identical.
|
|
54
|
+
*/
|
|
55
|
+
export function createMcpServer(service, principal, info) {
|
|
56
|
+
const server = new McpServer({ name: 'made-easy', version: info.version });
|
|
57
|
+
const tool = (name, title, description, shape, run, readOnly = false) => {
|
|
58
|
+
server.registerTool(`${TOOL_PREFIX}${name}`, { title, description, inputSchema: shape, annotations: { readOnlyHint: readOnly, openWorldHint: false } }, (async (args) => {
|
|
59
|
+
try {
|
|
60
|
+
return await run(args);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
return fail(e);
|
|
64
|
+
}
|
|
65
|
+
}));
|
|
66
|
+
};
|
|
67
|
+
tool('list_guide_recipes', 'List recipes', 'List the available recipes (profile.preset), such as market.quickstart or sdk.handbook.', {}, async () => ok({ recipes: await service.listRecipes() }), true);
|
|
68
|
+
tool('get_guide_recipe', 'Get a recipe', 'Get one recipe by ID: its six human section roles in order, the required fields per role, the subject-profile requirements and the preset rules.', { recipeId: z.string().describe('Recipe id, for example sdk.handbook') }, async (a) => ok(await service.getRecipe(a.recipeId)), true);
|
|
69
|
+
tool('create_guide', 'Create a guide', 'Scaffold a two-track guide from a recipe and store it as revision 1. Placeholders are warnings in draft mode and errors in release mode.', {
|
|
70
|
+
recipe: z.string().describe('Recipe id, for example market.quickstart'),
|
|
71
|
+
subjectName: z.string().describe('The subject the guide is about, for example "AI Visibility"'),
|
|
72
|
+
subtitle: z.string().optional(),
|
|
73
|
+
scope: z.string().optional(),
|
|
74
|
+
guideId: z.string().optional(),
|
|
75
|
+
}, async (a) => {
|
|
76
|
+
const r = await service.createGuide(principal, { recipe: a.recipe, subject: { name: a.subjectName, subtitle: a.subtitle, scope: a.scope }, guideId: a.guideId });
|
|
77
|
+
return ok({ guideId: r.guide.guideId, revision: r.revision, files: r.files });
|
|
78
|
+
});
|
|
79
|
+
tool('list_guides', 'List guides', 'List the guides in this tenant.', {}, async () => ok({ guides: await service.listGuides(principal) }), true);
|
|
80
|
+
tool('read_guide_files', 'Read guide files', 'Read the files of a stored guide revision (default: head). Returns the revision to pass back as expectedRevision when writing.', { guideId: z.string(), revision: z.string().optional(), paths: z.array(z.string()).optional().describe('Only these paths. Default: all.') }, async (a) => {
|
|
81
|
+
const r = await service.getFiles(principal, a.guideId, a.revision);
|
|
82
|
+
const files = Object.fromEntries(Object.entries(r.files).filter(([p]) => !a.paths || a.paths.includes(p)));
|
|
83
|
+
return ok({ revision: r.revision, files });
|
|
84
|
+
}, true);
|
|
85
|
+
tool('write_guide_files', 'Write guide files', 'Save a new revision of a guide. For an existing guide, send the complete bundle and expectedRevision (the revision you last read); a mismatch is refused and nothing is changed.', { guideId: z.string(), files: z.record(z.string(), z.string()).describe('Complete bundle: relative path -> UTF-8 text'), expectedRevision: z.string().optional() }, async (a) => {
|
|
86
|
+
const r = await service.saveFiles(principal, a.guideId, a.files, { expectedRevision: a.expectedRevision });
|
|
87
|
+
return ok({ guideId: a.guideId, revision: r.revision, changed: r.changed });
|
|
88
|
+
});
|
|
89
|
+
tool('validate_guide', 'Validate a guide', 'Validate a bundle and return located diagnostics (file, line, pointer, block). Use mode "release" to see what blocks publication.', { ...SourceShape, mode: z.enum(['draft', 'release']).default('draft'), audience: z.enum(['private', 'public']).optional() }, async (a) => {
|
|
90
|
+
const r = await service.validate(principal, { source: sourceOf(a), mode: a.mode, audience: a.audience });
|
|
91
|
+
return ok(r, [], `${r.ok ? 'OK' : 'FAILED'} (${r.mode}): ${r.summary.errors} error(s), ${r.summary.warnings} warning(s)\n${JSON.stringify(r.diagnostics.filter((d) => d.severity !== 'info'), null, 2)}`);
|
|
92
|
+
}, true);
|
|
93
|
+
tool('preview_guide', 'Preview a track', 'Render one track (human, operator or brief) as html, markdown or json without building artifacts.', {
|
|
94
|
+
...SourceShape,
|
|
95
|
+
track: z.enum(['human', 'operator', 'brief']).default('human'),
|
|
96
|
+
format: z.enum(['html', 'markdown', 'json']).default('markdown'),
|
|
97
|
+
mode: z.enum(['draft', 'release']).default('draft'),
|
|
98
|
+
}, async (a) => {
|
|
99
|
+
const r = await service.preview(principal, { source: sourceOf(a), track: a.track, format: a.format, mode: a.mode });
|
|
100
|
+
return ok({ ok: r.ok, revision: r.revision, mediaType: r.mediaType, diagnostics: r.diagnostics }, [], r.content ?? JSON.stringify(r.diagnostics, null, 2));
|
|
101
|
+
}, true);
|
|
102
|
+
tool('build_guide', 'Start a build', 'Start a build job (HTML, PDF, brief, operator reference, manifest, ZIP). Returns immediately with a job; poll made_easy_get_guide_job. Pass an idempotencyKey to make retries safe.', {
|
|
103
|
+
...SourceShape,
|
|
104
|
+
mode: z.enum(['draft', 'release']).default('draft'),
|
|
105
|
+
audience: z.enum(['private', 'public']).default('private'),
|
|
106
|
+
formats: z.array(z.enum(['html', 'pdf'])).default(['html', 'pdf']),
|
|
107
|
+
paper: z.array(z.enum(['A4', 'Letter'])).default(['A4']),
|
|
108
|
+
zip: z.boolean().default(true),
|
|
109
|
+
allowPartial: z.boolean().default(false),
|
|
110
|
+
idempotencyKey: z.string().max(200).optional(),
|
|
111
|
+
}, async (a) => {
|
|
112
|
+
const job = await service.startBuild(principal, { source: sourceOf(a), mode: a.mode, audience: a.audience, formats: a.formats, paper: a.paper, zip: a.zip, allowPartial: a.allowPartial }, { idempotencyKey: a.idempotencyKey });
|
|
113
|
+
return ok({ job: jobSummary(job) }, [], `Started ${job.id} (${job.status}). Poll made_easy_get_guide_job with this jobId.`);
|
|
114
|
+
});
|
|
115
|
+
if (service.canDraft) {
|
|
116
|
+
tool('draft_guide', 'Draft sections', 'Start a draft job that proposes text for chosen sections from a pinned source snapshot. It never changes the guide: the job result holds a proposal you review and then apply with made_easy_apply_guide_draft. Returns a job; poll made_easy_get_guide_job.', {
|
|
117
|
+
guideId: z.string().describe('A stored guide.'),
|
|
118
|
+
sections: z.array(z.object({ track: z.enum(['human', 'operator']).default('human'), entry: z.string() })).min(1),
|
|
119
|
+
snapshot: z.object({
|
|
120
|
+
id: z.string(),
|
|
121
|
+
sources: z.array(z.object({ id: z.string(), title: z.string(), version: z.string(), locator: z.string(), excerpt: z.string().optional() })).min(1),
|
|
122
|
+
}),
|
|
123
|
+
expectedRevision: z.string().optional(),
|
|
124
|
+
idempotencyKey: z.string().max(200).optional(),
|
|
125
|
+
}, async (a) => {
|
|
126
|
+
const job = await service.startDraft(principal, { source: { kind: 'guide', guideId: a.guideId }, sections: a.sections, snapshot: a.snapshot, expectedRevision: a.expectedRevision }, { idempotencyKey: a.idempotencyKey });
|
|
127
|
+
return ok({ job: jobSummary(job) }, [], `Started ${job.id} (${job.status}). Poll made_easy_get_guide_job with this jobId.`);
|
|
128
|
+
});
|
|
129
|
+
tool('apply_guide_draft', 'Apply a draft', 'Apply a reviewed draft proposal as a new revision. Refused, with nothing changed, if the guide has moved on from the revision the proposal was drafted against.', {
|
|
130
|
+
guideId: z.string(),
|
|
131
|
+
expectedRevision: z.string().describe('The revision the proposal was drafted against.'),
|
|
132
|
+
proposal: z.record(z.string(), z.unknown()).describe('The proposal from a succeeded draft job.'),
|
|
133
|
+
entries: z.array(z.string()).optional().describe('Apply only these entries. Default: all.'),
|
|
134
|
+
}, async (a) => {
|
|
135
|
+
const r = await service.applyDraft(principal, a.guideId, { proposal: a.proposal, expectedRevision: a.expectedRevision, entries: a.entries });
|
|
136
|
+
return ok({ guideId: a.guideId, revision: r.revision, changed: r.changed });
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
tool('get_guide_job', 'Get a job', 'Get a job. A succeeded build lists its artifacts as resource links you can read.', { jobId: z.string() }, async (a) => {
|
|
140
|
+
const job = await service.getJob(principal, a.jobId);
|
|
141
|
+
return ok({ job: jobSummary(job) }, jobLinks(job));
|
|
142
|
+
}, true);
|
|
143
|
+
tool('cancel_guide_job', 'Cancel a job', 'Cancel a queued or running job. A cancelled worker can no longer publish artifacts.', { jobId: z.string() }, async (a) => {
|
|
144
|
+
const job = await service.cancelJob(principal, a.jobId);
|
|
145
|
+
return ok({ job: jobSummary(job) });
|
|
146
|
+
});
|
|
147
|
+
tool('approve_guide_revision', 'Approve a revision', 'Approve one exact revision for release. Approvals do not carry over to later revisions. Needs the reviewer role.', { guideId: z.string(), revision: z.string(), note: z.string().optional() }, async (a) => ok({ approval: await service.approve(principal, a.guideId, a.revision, a.note) }));
|
|
148
|
+
tool('release_guide', 'Release a revision', 'Publish an approved revision from a succeeded, complete, public release-mode build job of exactly that revision. Atomic and idempotent. Needs the publisher role.', { guideId: z.string(), revision: z.string(), jobId: z.string(), idempotencyKey: z.string().max(200).optional() }, async (a) => ok({ release: await service.release(principal, a.guideId, { revision: a.revision, jobId: a.jobId }, { idempotencyKey: a.idempotencyKey }) }));
|
|
149
|
+
tool('list_guide_releases', 'List releases', 'List the releases of a guide.', { guideId: z.string() }, async (a) => ok({ releases: await service.listReleases(principal, a.guideId) }), true);
|
|
150
|
+
server.registerResource('artifact', new ResourceTemplate(`${RESOURCE_SCHEME}://jobs/{jobId}/artifacts/{artifactId}`, { list: undefined }), { title: 'Build artifact', description: 'A file produced by a succeeded build job.' }, async (uri, vars) => {
|
|
151
|
+
const jobId = String(vars.jobId);
|
|
152
|
+
const artifactId = decodeURIComponent(String(vars.artifactId));
|
|
153
|
+
const { descriptor, bytes } = await service.readArtifact(principal, jobId, artifactId);
|
|
154
|
+
const textual = /^(text\/|application\/(json|yaml))/.test(descriptor.mediaType);
|
|
155
|
+
return {
|
|
156
|
+
contents: [
|
|
157
|
+
textual
|
|
158
|
+
? { uri: uri.href, mimeType: descriptor.mediaType, text: Buffer.from(bytes).toString('utf8') }
|
|
159
|
+
: { uri: uri.href, mimeType: descriptor.mediaType, blob: Buffer.from(bytes).toString('base64') },
|
|
160
|
+
],
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
return server;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/stdio.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface Io {
|
|
2
|
+
err(text: string): void;
|
|
3
|
+
cwd: string;
|
|
4
|
+
env: NodeJS.ProcessEnv;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Run the MCP server on stdio for a single local user. State lives in --data (default ./.made-easy);
|
|
8
|
+
* the local user gets every role unless --roles narrows it. Logs go to stderr; stdout is the protocol.
|
|
9
|
+
*/
|
|
10
|
+
export declare function startStdioFromArgs(args: string[], io?: Io): Promise<number | undefined>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=stdio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAOA,UAAU,EAAE;IACV,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoC7F"}
|
package/dist/stdio.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { parseArgs } from 'node:util';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { VERSION, createChatCompletionsAdapter } from '@x12i/made-easy';
|
|
5
|
+
import { DirectoryReleaseTarget, FileStore, MadeEasyService } from '@x12i/made-easy-service';
|
|
6
|
+
import { createMcpServer } from './server.js';
|
|
7
|
+
/**
|
|
8
|
+
* Run the MCP server on stdio for a single local user. State lives in --data (default ./.made-easy);
|
|
9
|
+
* the local user gets every role unless --roles narrows it. Logs go to stderr; stdout is the protocol.
|
|
10
|
+
*/
|
|
11
|
+
export async function startStdioFromArgs(args, io) {
|
|
12
|
+
const { values } = parseArgs({
|
|
13
|
+
args,
|
|
14
|
+
options: {
|
|
15
|
+
data: { type: 'string' },
|
|
16
|
+
'release-dir': { type: 'string' },
|
|
17
|
+
tenant: { type: 'string' },
|
|
18
|
+
caller: { type: 'string' },
|
|
19
|
+
roles: { type: 'string' },
|
|
20
|
+
'allow-paths': { type: 'boolean' },
|
|
21
|
+
},
|
|
22
|
+
strict: true,
|
|
23
|
+
});
|
|
24
|
+
const cwd = io?.cwd ?? process.cwd();
|
|
25
|
+
const env = io?.env ?? process.env;
|
|
26
|
+
const data = resolve(cwd, values.data ?? env.MADE_EASY_DATA ?? '.made-easy');
|
|
27
|
+
const roles = (values.roles ?? 'author,reviewer,publisher').split(',').map((r) => r.trim()).filter(Boolean);
|
|
28
|
+
const service = new MadeEasyService({
|
|
29
|
+
store: new FileStore(resolve(data, 'store')),
|
|
30
|
+
releaseTarget: new DirectoryReleaseTarget(resolve(cwd, values['release-dir'] ?? resolve(data, 'releases'))),
|
|
31
|
+
allowPathSources: values['allow-paths'] ?? false,
|
|
32
|
+
browserPath: env.MADE_EASY_BROWSER,
|
|
33
|
+
// Draft tools are offered only when a provider is configured (OpenAI-compatible; bring your own key).
|
|
34
|
+
draftAdapter: env.MADE_EASY_DRAFT_ENDPOINT && env.MADE_EASY_DRAFT_MODEL
|
|
35
|
+
? createChatCompletionsAdapter({ endpoint: env.MADE_EASY_DRAFT_ENDPOINT, model: env.MADE_EASY_DRAFT_MODEL, apiKey: env.MADE_EASY_DRAFT_API_KEY })
|
|
36
|
+
: undefined,
|
|
37
|
+
});
|
|
38
|
+
await service.recover();
|
|
39
|
+
const server = createMcpServer(service, { tenantId: values.tenant ?? 'local', callerId: values.caller ?? 'local-user', roles }, { version: VERSION });
|
|
40
|
+
await server.connect(new StdioServerTransport());
|
|
41
|
+
(io?.err ?? ((t) => process.stderr.write(t)))(`made-easy MCP server ${VERSION} on stdio (data: ${data})\n`);
|
|
42
|
+
// Keep running until the client disconnects.
|
|
43
|
+
await new Promise((done) => process.stdin.once('close', done));
|
|
44
|
+
await service.close();
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x12i/made-easy-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Made Easy MCP server: create, validate, preview, build, approve and release guides from any MCP client. Stdio and bearer-authenticated streamable HTTP; builds are jobs and results come back as resource links.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"made-easy",
|
|
8
|
+
"mcp",
|
|
9
|
+
"model-context-protocol",
|
|
10
|
+
"agents",
|
|
11
|
+
"x12i"
|
|
12
|
+
],
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "x12i",
|
|
15
|
+
"homepage": "https://github.com/x12i/made-easy#readme",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/x12i/made-easy.git",
|
|
19
|
+
"directory": "packages/mcp"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/x12i/made-easy/issues"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=22"
|
|
26
|
+
},
|
|
27
|
+
"bin": {
|
|
28
|
+
"made-easy-mcp": "dist/bin.js"
|
|
29
|
+
},
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"import": "./dist/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"README.md",
|
|
42
|
+
"LICENSE"
|
|
43
|
+
],
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@modelcontextprotocol/sdk": "^1.20.0",
|
|
49
|
+
"@x12i/made-easy": "^0.1.0",
|
|
50
|
+
"@x12i/made-easy-service": "^0.1.0",
|
|
51
|
+
"zod": "^4.1.0"
|
|
52
|
+
}
|
|
53
|
+
}
|