funifier-mcp 0.3.17 → 0.3.19
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/.cursor/rules/funifier.mdc +3 -1
- package/.github/copilot-instructions.md +3 -1
- package/AGENTS.md +3 -1
- package/CHANGELOG.md +59 -0
- package/README.md +1 -1
- package/datasource-funifier-docs/.coverage.json +15 -5
- package/datasource-funifier-docs/.validation.json +77 -36
- package/datasource-funifier-docs/knowledge/guides/aggregates.md +13 -6
- package/datasource-funifier-docs/knowledge/guides/permission-audit.md +229 -0
- package/datasource-funifier-docs/knowledge/index.md +3 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +3 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/core/api-client.d.ts +2 -0
- package/dist/core/api-client.d.ts.map +1 -1
- package/dist/core/api-client.js +98 -47
- package/dist/core/api-client.js.map +1 -1
- package/dist/core/api-client.test.js +27 -0
- package/dist/core/api-client.test.js.map +1 -1
- package/dist/core/constants.d.ts +4 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +8 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/logger.d.ts +9 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +50 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/mcp/api-holder.test.d.ts +2 -0
- package/dist/mcp/api-holder.test.d.ts.map +1 -0
- package/dist/mcp/api-holder.test.js +45 -0
- package/dist/mcp/api-holder.test.js.map +1 -0
- package/dist/mcp/bundle.js +108 -105
- package/dist/mcp/check-update.d.ts +9 -0
- package/dist/mcp/check-update.d.ts.map +1 -1
- package/dist/mcp/check-update.js +35 -9
- package/dist/mcp/check-update.js.map +1 -1
- package/dist/mcp/check-update.test.js +36 -6
- package/dist/mcp/check-update.test.js.map +1 -1
- package/dist/mcp/doc-path.d.ts +11 -0
- package/dist/mcp/doc-path.d.ts.map +1 -0
- package/dist/mcp/doc-path.js +66 -0
- package/dist/mcp/doc-path.js.map +1 -0
- package/dist/mcp/doc-path.test.d.ts +2 -0
- package/dist/mcp/doc-path.test.d.ts.map +1 -0
- package/dist/mcp/doc-path.test.js +77 -0
- package/dist/mcp/doc-path.test.js.map +1 -0
- package/dist/mcp/index.js +19 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/resources/documentation.d.ts.map +1 -1
- package/dist/mcp/resources/documentation.js +7 -3
- package/dist/mcp/resources/documentation.js.map +1 -1
- package/dist/mcp/tools/_audit.d.ts +103 -0
- package/dist/mcp/tools/_audit.d.ts.map +1 -0
- package/dist/mcp/tools/_audit.js +241 -0
- package/dist/mcp/tools/_audit.js.map +1 -0
- package/dist/mcp/tools/_audit.test.d.ts +2 -0
- package/dist/mcp/tools/_audit.test.d.ts.map +1 -0
- package/dist/mcp/tools/_audit.test.js +412 -0
- package/dist/mcp/tools/_audit.test.js.map +1 -0
- package/dist/mcp/tools/_backup.d.ts +37 -3
- package/dist/mcp/tools/_backup.d.ts.map +1 -1
- package/dist/mcp/tools/_backup.js +142 -11
- package/dist/mcp/tools/_backup.js.map +1 -1
- package/dist/mcp/tools/_backup.test.js +195 -0
- package/dist/mcp/tools/_backup.test.js.map +1 -1
- package/dist/mcp/tools/_char-guard.d.ts +2 -1
- package/dist/mcp/tools/_char-guard.d.ts.map +1 -1
- package/dist/mcp/tools/_char-guard.js +10 -3
- package/dist/mcp/tools/_char-guard.js.map +1 -1
- package/dist/mcp/tools/_fetch-current.d.ts +2 -1
- package/dist/mcp/tools/_fetch-current.d.ts.map +1 -1
- package/dist/mcp/tools/_fetch-current.js +2 -74
- package/dist/mcp/tools/_fetch-current.js.map +1 -1
- package/dist/mcp/tools/_registry.d.ts +183 -0
- package/dist/mcp/tools/_registry.d.ts.map +1 -0
- package/dist/mcp/tools/_registry.js +88 -0
- package/dist/mcp/tools/_registry.js.map +1 -0
- package/dist/mcp/tools/_registry.test.d.ts +2 -0
- package/dist/mcp/tools/_registry.test.d.ts.map +1 -0
- package/dist/mcp/tools/_registry.test.js +103 -0
- package/dist/mcp/tools/_registry.test.js.map +1 -0
- package/dist/mcp/tools/_scope-engine.d.ts +40 -0
- package/dist/mcp/tools/_scope-engine.d.ts.map +1 -0
- package/dist/mcp/tools/_scope-engine.js +197 -0
- package/dist/mcp/tools/_scope-engine.js.map +1 -0
- package/dist/mcp/tools/_scope-engine.test.d.ts +2 -0
- package/dist/mcp/tools/_scope-engine.test.d.ts.map +1 -0
- package/dist/mcp/tools/_scope-engine.test.js +241 -0
- package/dist/mcp/tools/_scope-engine.test.js.map +1 -0
- package/dist/mcp/tools/database.d.ts +4 -0
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +23 -4
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/database.test.js +19 -0
- package/dist/mcp/tools/database.test.js.map +1 -1
- package/dist/mcp/tools/delete.d.ts.map +1 -1
- package/dist/mcp/tools/delete.js +3 -98
- package/dist/mcp/tools/delete.js.map +1 -1
- package/dist/mcp/tools/execute.d.ts.map +1 -1
- package/dist/mcp/tools/execute.js +36 -4
- package/dist/mcp/tools/execute.js.map +1 -1
- package/dist/mcp/tools/execute.test.d.ts +2 -0
- package/dist/mcp/tools/execute.test.d.ts.map +1 -0
- package/dist/mcp/tools/execute.test.js +87 -0
- package/dist/mcp/tools/execute.test.js.map +1 -0
- package/dist/mcp/tools/get.d.ts.map +1 -1
- package/dist/mcp/tools/get.js +4 -93
- package/dist/mcp/tools/get.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +42 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/list.d.ts.map +1 -1
- package/dist/mcp/tools/list.js +3 -91
- package/dist/mcp/tools/list.js.map +1 -1
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +5 -3
- package/dist/mcp/tools/logs.js.map +1 -1
- package/dist/mcp/tools/permissions.d.ts.map +1 -1
- package/dist/mcp/tools/permissions.js +68 -11
- package/dist/mcp/tools/permissions.js.map +1 -1
- package/dist/mcp/tools/permissions.test.js +268 -4
- package/dist/mcp/tools/permissions.test.js.map +1 -1
- package/dist/mcp/tools/read-doc.d.ts.map +1 -1
- package/dist/mcp/tools/read-doc.js +10 -28
- package/dist/mcp/tools/read-doc.js.map +1 -1
- package/dist/mcp/tools/save.d.ts.map +1 -1
- package/dist/mcp/tools/save.js +4 -81
- package/dist/mcp/tools/save.js.map +1 -1
- package/package.json +3 -2
- package/skills/funifier/SKILL.md +3 -1
- package/skills/funifier/references/audit-permissions.md +97 -0
- package/skills/funifier/references/configure-security.md +6 -0
- package/skills/funifier/references/create-action.md +7 -0
- package/skills/funifier/references/create-aggregate.md +99 -79
- package/skills/funifier/references/create-audit.md +8 -0
- package/skills/funifier/references/create-challenge.md +7 -0
- package/skills/funifier/references/create-competition.md +7 -0
- package/skills/funifier/references/create-crossword.md +6 -0
- package/skills/funifier/references/create-custom-object.md +6 -0
- package/skills/funifier/references/create-custom-page.md +6 -0
- package/skills/funifier/references/create-folder.md +7 -0
- package/skills/funifier/references/create-lastmile.md +6 -0
- package/skills/funifier/references/create-leaderboard.md +6 -0
- package/skills/funifier/references/create-level.md +7 -0
- package/skills/funifier/references/create-lottery.md +7 -0
- package/skills/funifier/references/create-mystery.md +6 -0
- package/skills/funifier/references/create-notification.md +6 -0
- package/skills/funifier/references/create-point.md +7 -0
- package/skills/funifier/references/create-quiz.md +7 -0
- package/skills/funifier/references/create-scheduler.md +6 -0
- package/skills/funifier/references/create-story.md +6 -0
- package/skills/funifier/references/create-swap.md +6 -0
- package/skills/funifier/references/create-trigger.md +8 -0
- package/skills/funifier/references/create-virtual-good.md +6 -0
- package/skills/funifier/references/create-webhook.md +6 -0
- package/skills/funifier/references/create-websocket.md +6 -0
- package/skills/funifier/references/create-widget.md +6 -0
- package/skills/funifier/references/date-handling.md +6 -0
- package/skills/funifier/references/debug.md +6 -0
- package/skills/funifier/references/help.md +6 -0
- package/skills/funifier/references/implement-frontend.md +7 -0
- package/skills/funifier/references/import-csv.md +6 -0
- package/skills/funifier/references/manage-indexes.md +6 -0
- package/skills/funifier/references/manage-player.md +7 -0
- package/skills/funifier/references/manage-team.md +6 -0
- package/skills/funifier/references/query-aggregate.md +111 -0
- package/skills/funifier/references/upload-file.md +6 -0
- package/datasource-funifier-docs/.search-index.json +0 -58758
- package/datasource-funifier-docs/.skills-map.json +0 -141
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
declare function isOutdated(current: string, latest: string): boolean;
|
|
2
|
+
/**
|
|
3
|
+
* A major bump signals breaking changes and deserves a stronger warning than a
|
|
4
|
+
* routine patch. Pre-1.0 (semver convention) the MINOR position carries the
|
|
5
|
+
* breaking-change meaning, so 0.3.x → 0.4.0 is treated as major too.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isMajorUpdate(current: string, latest: string): boolean;
|
|
2
8
|
export declare function setUpdateNotice(notice: string): void;
|
|
3
9
|
/** Returns the pending update notice once, then clears it (show only once per session). */
|
|
4
10
|
export declare function consumeUpdateNotice(): string | null;
|
|
@@ -7,6 +13,9 @@ export declare function consumeUpdateNotice(): string | null;
|
|
|
7
13
|
* The plain status string read as ambient noise: the model ignored it and the user's eye
|
|
8
14
|
* skipped it in the collapsed tool output. Putting the facts on top and a single imperative
|
|
9
15
|
* line below makes the assistant relay it once, in the user's own language, then move on.
|
|
16
|
+
*
|
|
17
|
+
* Tone scales with severity: a routine patch/minor gets one quiet line; a major bump
|
|
18
|
+
* (breaking changes) tells the user to read the changelog before updating.
|
|
10
19
|
*/
|
|
11
20
|
export declare function formatUpdateNotice(current: string, latest: string): string;
|
|
12
21
|
export declare function checkForUpdate(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-update.d.ts","sourceRoot":"","sources":["../../src/mcp/check-update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"check-update.d.ts","sourceRoot":"","sources":["../../src/mcp/check-update.ts"],"names":[],"mappings":"AAOA,iBAAS,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKtE;AAMD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAInD;AAID;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAmB1E;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAsBpD;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/mcp/check-update.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMajorUpdate = isMajorUpdate;
|
|
3
4
|
exports.setUpdateNotice = setUpdateNotice;
|
|
4
5
|
exports.consumeUpdateNotice = consumeUpdateNotice;
|
|
5
6
|
exports.formatUpdateNotice = formatUpdateNotice;
|
|
6
7
|
exports.checkForUpdate = checkForUpdate;
|
|
7
8
|
exports.isOutdated = isOutdated;
|
|
8
|
-
function
|
|
9
|
-
|
|
9
|
+
function toTuple(v) {
|
|
10
|
+
return v
|
|
10
11
|
.replace(/[^0-9.]/g, "")
|
|
11
12
|
.split(".")
|
|
12
13
|
.map(Number);
|
|
14
|
+
}
|
|
15
|
+
function isOutdated(current, latest) {
|
|
13
16
|
const [cMaj, cMin, cPatch] = toTuple(current);
|
|
14
17
|
const [lMaj, lMin, lPatch] = toTuple(latest);
|
|
15
18
|
if (lMaj !== cMaj)
|
|
@@ -18,6 +21,18 @@ function isOutdated(current, latest) {
|
|
|
18
21
|
return lMin > cMin;
|
|
19
22
|
return lPatch > cPatch;
|
|
20
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* A major bump signals breaking changes and deserves a stronger warning than a
|
|
26
|
+
* routine patch. Pre-1.0 (semver convention) the MINOR position carries the
|
|
27
|
+
* breaking-change meaning, so 0.3.x → 0.4.0 is treated as major too.
|
|
28
|
+
*/
|
|
29
|
+
function isMajorUpdate(current, latest) {
|
|
30
|
+
const [cMaj, cMin] = toTuple(current);
|
|
31
|
+
const [lMaj, lMin] = toTuple(latest);
|
|
32
|
+
if (lMaj !== cMaj)
|
|
33
|
+
return true;
|
|
34
|
+
return cMaj === 0 && lMin !== cMin;
|
|
35
|
+
}
|
|
21
36
|
// Set when an update is detected; surfaced once on the next tool result so the
|
|
22
37
|
// user actually sees it (stdio MCP stderr is hidden from chat by most clients).
|
|
23
38
|
let pendingNotice = null;
|
|
@@ -30,21 +45,32 @@ function consumeUpdateNotice() {
|
|
|
30
45
|
pendingNotice = null;
|
|
31
46
|
return notice;
|
|
32
47
|
}
|
|
48
|
+
const CHANGELOG_URL = "https://github.com/funifierinc/funifier-mcp/blob/main/CHANGELOG.md";
|
|
33
49
|
/**
|
|
34
50
|
* Builds the update notice as a directive to the assistant, not a passive status line.
|
|
35
51
|
* The plain status string read as ambient noise: the model ignored it and the user's eye
|
|
36
52
|
* skipped it in the collapsed tool output. Putting the facts on top and a single imperative
|
|
37
53
|
* line below makes the assistant relay it once, in the user's own language, then move on.
|
|
54
|
+
*
|
|
55
|
+
* Tone scales with severity: a routine patch/minor gets one quiet line; a major bump
|
|
56
|
+
* (breaking changes) tells the user to read the changelog before updating.
|
|
38
57
|
*/
|
|
39
58
|
function formatUpdateNotice(current, latest) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
59
|
+
const major = isMajorUpdate(current, latest);
|
|
60
|
+
const headline = major
|
|
61
|
+
? `⬆ funifier-mcp: nova versão com MUDANÇAS INCOMPATÍVEIS disponível (${current} → ${latest}).`
|
|
62
|
+
: `⬆ funifier-mcp: nova versão disponível (${current} → ${latest}).`;
|
|
63
|
+
const instruction = major
|
|
64
|
+
? `[assistant instruction] Before continuing, tell the user — in one or two short sentences, ` +
|
|
65
|
+
`in the language they are using — that funifier-mcp ${latest} is available and likely contains ` +
|
|
66
|
+
`BREAKING CHANGES, so they should review the changelog (${CHANGELOG_URL}) before updating with ` +
|
|
67
|
+
"`npx funifier-mcp@latest init`. Relay only these facts, do not speculate about what changed, " +
|
|
68
|
+
`then continue with their task.`
|
|
69
|
+
: `[assistant instruction] Before continuing, tell the user — in one short sentence, in the ` +
|
|
44
70
|
`language they are using — that a newer version of funifier-mcp is available and that they ` +
|
|
45
|
-
"should run `npx funifier-mcp@latest init` to update
|
|
46
|
-
`
|
|
47
|
-
].join("\n");
|
|
71
|
+
"should run `npx funifier-mcp@latest init` to update (changelog: " + CHANGELOG_URL + "). " +
|
|
72
|
+
`One line only, do not speculate about what changed, then continue with their task.`;
|
|
73
|
+
return [headline, ``, instruction].join("\n");
|
|
48
74
|
}
|
|
49
75
|
async function checkForUpdate() {
|
|
50
76
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-update.js","sourceRoot":"","sources":["../../src/mcp/check-update.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"check-update.js","sourceRoot":"","sources":["../../src/mcp/check-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,17 +30,47 @@ const check_update_1 = require("./check-update");
|
|
|
30
30
|
(0, vitest_1.expect)((0, check_update_1.consumeUpdateNotice)()).toBeNull();
|
|
31
31
|
});
|
|
32
32
|
});
|
|
33
|
+
(0, vitest_1.describe)("isMajorUpdate", () => {
|
|
34
|
+
(0, vitest_1.it)("major bump is major", () => {
|
|
35
|
+
(0, vitest_1.expect)((0, check_update_1.isMajorUpdate)("1.2.3", "2.0.0")).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.it)("minor/patch bumps at >=1.0 are not major", () => {
|
|
38
|
+
(0, vitest_1.expect)((0, check_update_1.isMajorUpdate)("1.2.3", "1.3.0")).toBe(false);
|
|
39
|
+
(0, vitest_1.expect)((0, check_update_1.isMajorUpdate)("1.2.3", "1.2.4")).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
(0, vitest_1.it)("pre-1.0: minor bump carries breaking-change meaning", () => {
|
|
42
|
+
(0, vitest_1.expect)((0, check_update_1.isMajorUpdate)("0.3.18", "0.4.0")).toBe(true);
|
|
43
|
+
(0, vitest_1.expect)((0, check_update_1.isMajorUpdate)("0.3.18", "1.0.0")).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)("pre-1.0: patch bump is not major", () => {
|
|
46
|
+
(0, vitest_1.expect)((0, check_update_1.isMajorUpdate)("0.3.18", "0.3.19")).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
33
49
|
(0, vitest_1.describe)("formatUpdateNotice", () => {
|
|
34
50
|
(0, vitest_1.it)("includes both versions", () => {
|
|
35
|
-
const notice = (0, check_update_1.formatUpdateNotice)("0.
|
|
36
|
-
(0, vitest_1.expect)(notice).toContain("0.
|
|
37
|
-
(0, vitest_1.expect)(notice).toContain("0.3.
|
|
51
|
+
const notice = (0, check_update_1.formatUpdateNotice)("0.3.18", "0.3.19");
|
|
52
|
+
(0, vitest_1.expect)(notice).toContain("0.3.18");
|
|
53
|
+
(0, vitest_1.expect)(notice).toContain("0.3.19");
|
|
38
54
|
});
|
|
39
|
-
(0, vitest_1.it)("includes the update command", () => {
|
|
40
|
-
|
|
55
|
+
(0, vitest_1.it)("includes the update command and changelog link", () => {
|
|
56
|
+
const notice = (0, check_update_1.formatUpdateNotice)("0.3.18", "0.3.19");
|
|
57
|
+
(0, vitest_1.expect)(notice).toContain("npx funifier-mcp@latest init");
|
|
58
|
+
(0, vitest_1.expect)(notice).toContain("CHANGELOG.md");
|
|
41
59
|
});
|
|
42
60
|
(0, vitest_1.it)("is framed as a directive to the assistant", () => {
|
|
43
|
-
(0, vitest_1.expect)((0, check_update_1.formatUpdateNotice)("0.
|
|
61
|
+
(0, vitest_1.expect)((0, check_update_1.formatUpdateNotice)("0.3.18", "0.3.19")).toContain("[assistant instruction]");
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)("routine patch update uses the quiet one-line tone", () => {
|
|
64
|
+
const notice = (0, check_update_1.formatUpdateNotice)("0.3.18", "0.3.19");
|
|
65
|
+
(0, vitest_1.expect)(notice).not.toContain("INCOMPATÍVEIS");
|
|
66
|
+
(0, vitest_1.expect)(notice).not.toContain("BREAKING CHANGES");
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.it)("major update warns about breaking changes and points to the changelog first", () => {
|
|
69
|
+
const notice = (0, check_update_1.formatUpdateNotice)("0.3.18", "0.4.0");
|
|
70
|
+
(0, vitest_1.expect)(notice).toContain("MUDANÇAS INCOMPATÍVEIS");
|
|
71
|
+
(0, vitest_1.expect)(notice).toContain("BREAKING CHANGES");
|
|
72
|
+
(0, vitest_1.expect)(notice).toContain("CHANGELOG.md");
|
|
73
|
+
(0, vitest_1.expect)(notice).toContain("npx funifier-mcp@latest init");
|
|
44
74
|
});
|
|
45
75
|
});
|
|
46
76
|
//# sourceMappingURL=check-update.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-update.test.js","sourceRoot":"","sources":["../../src/mcp/check-update.test.ts"],"names":[],"mappings":";;AAAA,mCAA0D;AAC1D,
|
|
1
|
+
{"version":3,"file":"check-update.test.js","sourceRoot":"","sources":["../../src/mcp/check-update.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function normalizeDocPath(input: string): string;
|
|
2
|
+
export type ResolvedDocPath = {
|
|
3
|
+
ok: true;
|
|
4
|
+
filePath: string;
|
|
5
|
+
normalized: string;
|
|
6
|
+
} | {
|
|
7
|
+
ok: false;
|
|
8
|
+
reason: "empty" | "invalid";
|
|
9
|
+
};
|
|
10
|
+
export declare function resolveDocPath(docsRoot: string, input: string): ResolvedDocPath;
|
|
11
|
+
//# sourceMappingURL=doc-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-path.d.ts","sourceRoot":"","sources":["../../src/mcp/doc-path.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC;AAO/C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAU/E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.normalizeDocPath = normalizeDocPath;
|
|
37
|
+
exports.resolveDocPath = resolveDocPath;
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
// Accepts the same identifiers the search tool, skill references, and resource
|
|
40
|
+
// URIs emit: "modules/trigger", "funifier://docs/modules/trigger", or
|
|
41
|
+
// "knowledge/modules/trigger.md".
|
|
42
|
+
function normalizeDocPath(input) {
|
|
43
|
+
return input
|
|
44
|
+
.trim()
|
|
45
|
+
.replace(/^funifier:\/\/docs\//, "")
|
|
46
|
+
.replace(/^\/+/, "")
|
|
47
|
+
.replace(/^knowledge\//, "")
|
|
48
|
+
.replace(/\.md$/, "");
|
|
49
|
+
}
|
|
50
|
+
// Single source of truth for turning a user/agent-supplied doc identifier into a
|
|
51
|
+
// safe absolute file path. SECURITY: confines the result to `docsRoot` so a path
|
|
52
|
+
// like "../../../etc/passwd" can never escape the documentation directory. Both
|
|
53
|
+
// the `funifier_read_doc` tool and the `funifier://docs/{+path}` resource MUST
|
|
54
|
+
// go through here so they cannot drift apart.
|
|
55
|
+
function resolveDocPath(docsRoot, input) {
|
|
56
|
+
const root = path.resolve(docsRoot);
|
|
57
|
+
const normalized = normalizeDocPath(input);
|
|
58
|
+
if (!normalized)
|
|
59
|
+
return { ok: false, reason: "empty" };
|
|
60
|
+
const filePath = path.resolve(root, `${normalized}.md`);
|
|
61
|
+
if (filePath !== root && !filePath.startsWith(root + path.sep)) {
|
|
62
|
+
return { ok: false, reason: "invalid" };
|
|
63
|
+
}
|
|
64
|
+
return { ok: true, filePath, normalized };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=doc-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-path.js","sourceRoot":"","sources":["../../src/mcp/doc-path.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,4CAOC;AAWD,wCAUC;AAjCD,2CAA6B;AAE7B,+EAA+E;AAC/E,sEAAsE;AACtE,kCAAkC;AAClC,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK;SACT,IAAI,EAAE;SACN,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;SACnC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC;AAMD,iFAAiF;AACjF,iFAAiF;AACjF,gFAAgF;AAChF,+EAA+E;AAC/E,8CAA8C;AAC9C,SAAgB,cAAc,CAAC,QAAgB,EAAE,KAAa;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAEvD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,UAAU,KAAK,CAAC,CAAC;IACxD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-path.test.d.ts","sourceRoot":"","sources":["../../src/mcp/doc-path.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const vitest_1 = require("vitest");
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const doc_path_1 = require("./doc-path");
|
|
39
|
+
const ROOT = "/tmp/funifier-docs";
|
|
40
|
+
(0, vitest_1.describe)("normalizeDocPath", () => {
|
|
41
|
+
(0, vitest_1.it)("strips the funifier://docs/ URI prefix", () => {
|
|
42
|
+
(0, vitest_1.expect)((0, doc_path_1.normalizeDocPath)("funifier://docs/modules/trigger")).toBe("modules/trigger");
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)("strips a leading knowledge/ and trailing .md", () => {
|
|
45
|
+
(0, vitest_1.expect)((0, doc_path_1.normalizeDocPath)("knowledge/modules/trigger.md")).toBe("modules/trigger");
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.it)("strips leading slashes and trims", () => {
|
|
48
|
+
(0, vitest_1.expect)((0, doc_path_1.normalizeDocPath)(" /guides/aggregates ")).toBe("guides/aggregates");
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.describe)("resolveDocPath", () => {
|
|
52
|
+
(0, vitest_1.it)("resolves a valid path inside the root", () => {
|
|
53
|
+
const result = (0, doc_path_1.resolveDocPath)(ROOT, "modules/trigger");
|
|
54
|
+
(0, vitest_1.expect)(result).toEqual({
|
|
55
|
+
ok: true,
|
|
56
|
+
filePath: path.join(ROOT, "modules", "trigger.md"),
|
|
57
|
+
normalized: "modules/trigger",
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
(0, vitest_1.it)("rejects an empty path", () => {
|
|
61
|
+
(0, vitest_1.expect)((0, doc_path_1.resolveDocPath)(ROOT, " ")).toEqual({ ok: false, reason: "empty" });
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)("rejects path traversal that escapes the root", () => {
|
|
64
|
+
(0, vitest_1.expect)((0, doc_path_1.resolveDocPath)(ROOT, "../../../etc/passwd")).toEqual({ ok: false, reason: "invalid" });
|
|
65
|
+
});
|
|
66
|
+
(0, vitest_1.it)("rejects traversal hidden behind the URI prefix", () => {
|
|
67
|
+
(0, vitest_1.expect)((0, doc_path_1.resolveDocPath)(ROOT, "funifier://docs/../../secrets")).toEqual({
|
|
68
|
+
ok: false,
|
|
69
|
+
reason: "invalid",
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.it)("rejects a sibling-directory prefix attack", () => {
|
|
73
|
+
// /tmp/funifier-docs-evil/x must not be accepted just because it startsWith the root string.
|
|
74
|
+
(0, vitest_1.expect)((0, doc_path_1.resolveDocPath)(ROOT, "../funifier-docs-evil/x")).toEqual({ ok: false, reason: "invalid" });
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=doc-path.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-path.test.js","sourceRoot":"","sources":["../../src/mcp/doc-path.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAA8C;AAC9C,2CAA6B;AAC7B,yCAA8D;AAE9D,MAAM,IAAI,GAAG,oBAAoB,CAAC;AAElC,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,IAAA,eAAM,EAAC,IAAA,2BAAgB,EAAC,iCAAiC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,IAAA,eAAM,EAAC,IAAA,2BAAgB,EAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,IAAA,eAAM,EAAC,IAAA,2BAAgB,EAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAA,yBAAc,EAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACvD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC;YAClD,UAAU,EAAE,iBAAiB;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC,CAAC,OAAO,CAAC;YACpE,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,6FAA6F;QAC7F,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACpG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -8,6 +8,7 @@ const tools_1 = require("./tools");
|
|
|
8
8
|
const documentation_1 = require("./resources/documentation");
|
|
9
9
|
const templates_1 = require("./prompts/templates");
|
|
10
10
|
const check_update_1 = require("./check-update");
|
|
11
|
+
const logger_1 = require("../core/logger");
|
|
11
12
|
async function main() {
|
|
12
13
|
const subcommand = process.argv[2];
|
|
13
14
|
if (subcommand === "init") {
|
|
@@ -50,6 +51,24 @@ async function main() {
|
|
|
50
51
|
// Connect to stdio transport
|
|
51
52
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
52
53
|
await server.connect(transport);
|
|
54
|
+
// Graceful shutdown: close the transport on termination signals so the client
|
|
55
|
+
// sees a clean disconnect instead of a dropped pipe.
|
|
56
|
+
let shuttingDown = false;
|
|
57
|
+
const shutdown = async (signal) => {
|
|
58
|
+
if (shuttingDown)
|
|
59
|
+
return;
|
|
60
|
+
shuttingDown = true;
|
|
61
|
+
logger_1.logger.info("shutting down", { signal });
|
|
62
|
+
try {
|
|
63
|
+
await server.close();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
/* ignore close errors during shutdown */
|
|
67
|
+
}
|
|
68
|
+
process.exit(0);
|
|
69
|
+
};
|
|
70
|
+
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
71
|
+
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
53
72
|
// Fire-and-forget: notify user if a newer version is available on npm
|
|
54
73
|
(0, check_update_1.checkForUpdate)().catch(() => { });
|
|
55
74
|
if (!autoConnected) {
|
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";;;AAEA,oEAAoE;AACpE,wEAAiF;AACjF,6CAAyC;AACzC,mCAAwC;AACxC,6DAA8D;AAC9D,mDAAsD;AACtD,iDAAgD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentation.d.ts","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"documentation.d.ts","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAyCtF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAsH3D"}
|
|
@@ -7,6 +7,7 @@ exports.registerResources = registerResources;
|
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
10
|
+
const doc_path_1 = require("../doc-path");
|
|
10
11
|
// Resolve docsPath using: explicit env var → bundled package paths → cwd fallback.
|
|
11
12
|
// Emits a console.error for each invalid/stale path so the failure is visible in MCP logs.
|
|
12
13
|
function resolveDocsPath() {
|
|
@@ -107,8 +108,11 @@ function registerResources(server) {
|
|
|
107
108
|
function readDoc(uri, variables) {
|
|
108
109
|
const pathVar = variables.path;
|
|
109
110
|
const docPath = Array.isArray(pathVar) ? pathVar.join("/") : (pathVar || "");
|
|
110
|
-
|
|
111
|
-
|
|
111
|
+
// SECURITY: confine reads to docsPath. The `{+path}` URI operator does NOT
|
|
112
|
+
// escape "/", so without this guard a path like "../../../etc/passwd" would
|
|
113
|
+
// resolve outside the docs directory. Mirrors the funifier_read_doc tool.
|
|
114
|
+
const resolved = (0, doc_path_1.resolveDocPath)(docsPath, docPath);
|
|
115
|
+
if (!resolved.ok || !fs_1.default.existsSync(resolved.filePath)) {
|
|
112
116
|
return {
|
|
113
117
|
contents: [
|
|
114
118
|
{
|
|
@@ -124,7 +128,7 @@ function registerResources(server) {
|
|
|
124
128
|
{
|
|
125
129
|
uri: uri.href,
|
|
126
130
|
mimeType: "text/markdown",
|
|
127
|
-
text: readCached(filePath),
|
|
131
|
+
text: readCached(resolved.filePath),
|
|
128
132
|
},
|
|
129
133
|
],
|
|
130
134
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentation.js","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"documentation.js","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const auditEntrySchema: z.ZodObject<{
|
|
3
|
+
method: z.ZodEffects<z.ZodString, string, string>;
|
|
4
|
+
path: z.ZodEffects<z.ZodString, string, string>;
|
|
5
|
+
auth: z.ZodString;
|
|
6
|
+
evidence: z.ZodString;
|
|
7
|
+
confidence: z.ZodDefault<z.ZodEnum<["high", "low"]>>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
method: string;
|
|
10
|
+
auth: string;
|
|
11
|
+
path: string;
|
|
12
|
+
evidence: string;
|
|
13
|
+
confidence: "high" | "low";
|
|
14
|
+
}, {
|
|
15
|
+
method: string;
|
|
16
|
+
auth: string;
|
|
17
|
+
path: string;
|
|
18
|
+
evidence: string;
|
|
19
|
+
confidence?: "high" | "low" | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
export declare const auditManifestSchema: z.ZodObject<{
|
|
22
|
+
version: z.ZodLiteral<1>;
|
|
23
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
24
|
+
method: z.ZodEffects<z.ZodString, string, string>;
|
|
25
|
+
path: z.ZodEffects<z.ZodString, string, string>;
|
|
26
|
+
auth: z.ZodString;
|
|
27
|
+
evidence: z.ZodString;
|
|
28
|
+
confidence: z.ZodDefault<z.ZodEnum<["high", "low"]>>;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
method: string;
|
|
31
|
+
auth: string;
|
|
32
|
+
path: string;
|
|
33
|
+
evidence: string;
|
|
34
|
+
confidence: "high" | "low";
|
|
35
|
+
}, {
|
|
36
|
+
method: string;
|
|
37
|
+
auth: string;
|
|
38
|
+
path: string;
|
|
39
|
+
evidence: string;
|
|
40
|
+
confidence?: "high" | "low" | undefined;
|
|
41
|
+
}>, "many">;
|
|
42
|
+
}, "strip", z.ZodTypeAny, {
|
|
43
|
+
entries: {
|
|
44
|
+
method: string;
|
|
45
|
+
auth: string;
|
|
46
|
+
path: string;
|
|
47
|
+
evidence: string;
|
|
48
|
+
confidence: "high" | "low";
|
|
49
|
+
}[];
|
|
50
|
+
version: 1;
|
|
51
|
+
}, {
|
|
52
|
+
entries: {
|
|
53
|
+
method: string;
|
|
54
|
+
auth: string;
|
|
55
|
+
path: string;
|
|
56
|
+
evidence: string;
|
|
57
|
+
confidence?: "high" | "low" | undefined;
|
|
58
|
+
}[];
|
|
59
|
+
version: 1;
|
|
60
|
+
}>;
|
|
61
|
+
export type AuditEntry = z.output<typeof auditEntrySchema>;
|
|
62
|
+
export type AuditManifest = z.output<typeof auditManifestSchema>;
|
|
63
|
+
type SecurityApplication = {
|
|
64
|
+
name: string;
|
|
65
|
+
app_secret: string;
|
|
66
|
+
scope: string;
|
|
67
|
+
};
|
|
68
|
+
type SecurityRole = {
|
|
69
|
+
name: string;
|
|
70
|
+
scope: string;
|
|
71
|
+
};
|
|
72
|
+
export type AuditSecurityDocument = {
|
|
73
|
+
apps?: SecurityApplication[];
|
|
74
|
+
roles?: SecurityRole[];
|
|
75
|
+
[key: string]: unknown;
|
|
76
|
+
};
|
|
77
|
+
export type FindingSeverity = "missing" | "excess" | "danger" | "manual-review" | "public-no-scope-needed" | "missing-principal";
|
|
78
|
+
export interface AuditFinding {
|
|
79
|
+
severity: FindingSeverity;
|
|
80
|
+
principal: string;
|
|
81
|
+
rule?: string;
|
|
82
|
+
evidence?: string;
|
|
83
|
+
path?: string;
|
|
84
|
+
method?: string;
|
|
85
|
+
requiredTokens?: string[];
|
|
86
|
+
excessTokens?: string[];
|
|
87
|
+
narrowingSuggestion?: string[];
|
|
88
|
+
detail: string;
|
|
89
|
+
}
|
|
90
|
+
export interface AuditReport {
|
|
91
|
+
manifest_entries: number;
|
|
92
|
+
findings: AuditFinding[];
|
|
93
|
+
notes: string[];
|
|
94
|
+
}
|
|
95
|
+
interface ResolvedPrincipal {
|
|
96
|
+
kind: "role" | "app" | "missing-principal";
|
|
97
|
+
label: string;
|
|
98
|
+
scope: string;
|
|
99
|
+
}
|
|
100
|
+
export declare function resolvePrincipal(auth: string, security: AuditSecurityDocument): ResolvedPrincipal;
|
|
101
|
+
export declare function runAudit(manifest: AuditManifest, security: AuditSecurityDocument): AuditReport;
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=_audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_audit.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/_audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAQ3B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG9B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC3D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIjE,KAAK,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/E,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACpD,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,eAAe,GACf,wBAAwB,GACxB,mBAAmB,CAAC;AAExB,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,mBAAmB,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,GAAG,iBAAiB,CAmCjG;AAyKD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,qBAAqB,GAAG,WAAW,CAkD9F"}
|