@migma/mcp 1.1.2 → 1.3.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/build/client.d.ts.map +1 -1
- package/build/client.js +3 -1
- package/build/client.js.map +1 -1
- package/build/config.d.ts.map +1 -1
- package/build/config.js +22 -4
- package/build/config.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +14 -11
- package/build/index.js.map +1 -1
- package/build/permissions.d.ts +2 -0
- package/build/permissions.d.ts.map +1 -0
- package/build/permissions.js +17 -0
- package/build/permissions.js.map +1 -0
- package/build/tools/__tests__/catalog.test.js +20 -9
- package/build/tools/__tests__/catalog.test.js.map +1 -1
- package/build/tools/campaigns.d.ts +1 -1
- package/build/tools/campaigns.d.ts.map +1 -1
- package/build/tools/campaigns.js +244 -222
- package/build/tools/campaigns.js.map +1 -1
- package/build/tools/capabilities.d.ts.map +1 -1
- package/build/tools/capabilities.js +8 -1
- package/build/tools/capabilities.js.map +1 -1
- package/build/tools/contacts.d.ts +1 -1
- package/build/tools/contacts.d.ts.map +1 -1
- package/build/tools/contacts.js +356 -156
- package/build/tools/contacts.js.map +1 -1
- package/build/tools/domains.d.ts +1 -1
- package/build/tools/domains.d.ts.map +1 -1
- package/build/tools/domains.js +98 -96
- package/build/tools/domains.js.map +1 -1
- package/build/tools/export.d.ts +1 -1
- package/build/tools/export.d.ts.map +1 -1
- package/build/tools/export.js +97 -78
- package/build/tools/export.js.map +1 -1
- package/build/tools/generate.d.ts +1 -1
- package/build/tools/generate.d.ts.map +1 -1
- package/build/tools/generate.js +171 -109
- package/build/tools/generate.js.map +1 -1
- package/build/tools/metrics.d.ts +4 -0
- package/build/tools/metrics.d.ts.map +1 -0
- package/build/tools/metrics.js +39 -0
- package/build/tools/metrics.js.map +1 -0
- package/build/tools/projects.d.ts +1 -1
- package/build/tools/projects.d.ts.map +1 -1
- package/build/tools/projects.js +89 -77
- package/build/tools/projects.js.map +1 -1
- package/build/tools/segments.d.ts +1 -1
- package/build/tools/segments.d.ts.map +1 -1
- package/build/tools/segments.js +91 -67
- package/build/tools/segments.js.map +1 -1
- package/build/tools/send.d.ts +1 -1
- package/build/tools/send.d.ts.map +1 -1
- package/build/tools/send.js +72 -69
- package/build/tools/send.js.map +1 -1
- package/build/tools/tags.d.ts +1 -1
- package/build/tools/tags.d.ts.map +1 -1
- package/build/tools/tags.js +77 -69
- package/build/tools/tags.js.map +1 -1
- package/build/tools/validate.d.ts +1 -1
- package/build/tools/validate.d.ts.map +1 -1
- package/build/tools/validate.js +54 -44
- package/build/tools/validate.js.map +1 -1
- package/build/tools/webhooks.d.ts +1 -1
- package/build/tools/webhooks.d.ts.map +1 -1
- package/build/tools/webhooks.js +67 -57
- package/build/tools/webhooks.js.map +1 -1
- package/package.json +2 -2
package/build/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAc/C"}
|
package/build/client.js
CHANGED
|
@@ -3,7 +3,9 @@ let instance = null;
|
|
|
3
3
|
export function getClient(config) {
|
|
4
4
|
if (!instance) {
|
|
5
5
|
if (!config.apiKey) {
|
|
6
|
-
throw new Error("
|
|
6
|
+
throw new Error("Local MCP needs a key. Connect https://migma.ai/mcp for browser OAuth, " +
|
|
7
|
+
"run migma login, or fetch https://api.migma.ai/auth.md. " +
|
|
8
|
+
"CI/servers can set MIGMA_API_KEY.");
|
|
7
9
|
}
|
|
8
10
|
instance = new Migma(config.apiKey, {
|
|
9
11
|
baseUrl: config.baseUrl,
|
package/build/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAG9B,IAAI,QAAQ,GAAiB,IAAI,CAAC;AAElC,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAG9B,IAAI,QAAQ,GAAiB,IAAI,CAAC;AAElC,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,yEAAyE;gBACvE,0DAA0D;gBAC1D,mCAAmC,CACtC,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;YAClC,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/build/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;EAIvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAkBlD,wBAAgB,UAAU,IAAI,MAAM,CAenC"}
|
package/build/config.js
CHANGED
|
@@ -1,14 +1,32 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
1
4
|
import { z } from "zod";
|
|
2
5
|
export const configSchema = z.object({
|
|
3
|
-
apiKey: z.string().describe("Migma API key (sk_live_...)"),
|
|
6
|
+
apiKey: z.string().describe("Scoped Migma API key for Local MCP (sk_live_...)"),
|
|
4
7
|
projectId: z.string().optional().describe("Default project ID"),
|
|
5
8
|
baseUrl: z.string().url().optional().describe("Custom API base URL"),
|
|
6
9
|
});
|
|
10
|
+
const CLI_CONFIG_FILE = join(homedir(), ".migma", "config.json");
|
|
11
|
+
function readCliConfigApiKey() {
|
|
12
|
+
if (!existsSync(CLI_CONFIG_FILE))
|
|
13
|
+
return undefined;
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(readFileSync(CLI_CONFIG_FILE, "utf-8"));
|
|
16
|
+
return typeof parsed.apiKey === "string" && parsed.apiKey.trim()
|
|
17
|
+
? parsed.apiKey.trim()
|
|
18
|
+
: undefined;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
7
24
|
export function loadConfig() {
|
|
8
|
-
const apiKey = process.env.MIGMA_API_KEY;
|
|
25
|
+
const apiKey = process.env.MIGMA_API_KEY || readCliConfigApiKey();
|
|
9
26
|
if (!apiKey) {
|
|
10
|
-
console.error("Warning:
|
|
11
|
-
"
|
|
27
|
+
console.error("Warning: Local MCP needs a key. Connect https://migma.ai/mcp for browser OAuth, " +
|
|
28
|
+
"run migma login, or fetch https://api.migma.ai/auth.md. " +
|
|
29
|
+
"CI/servers can set MIGMA_API_KEY.");
|
|
12
30
|
}
|
|
13
31
|
return configSchema.parse({
|
|
14
32
|
apiKey: apiKey || "",
|
package/build/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IAC/E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CACrE,CAAC,CAAC;AAIH,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEjE,SAAS,mBAAmB;IAC1B,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAE/D,CAAC;QACF,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAC9D,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YACtB,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,mBAAmB,EAAE,CAAC;IAClE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,kFAAkF;YAChF,0DAA0D;YAC1D,mCAAmC,CACtC,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC,KAAK,CAAC;QACxB,MAAM,EAAE,MAAM,IAAI,EAAE;QACpB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,SAAS;QACpD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,SAAS;KACjD,CAAC,CAAC;AACL,CAAC"}
|
package/build/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export type CreateMigmaMcpServerOptions = {
|
|
|
6
6
|
config?: Partial<Config>;
|
|
7
7
|
client?: Migma;
|
|
8
8
|
getClient?: () => Migma;
|
|
9
|
+
permissions?: string[];
|
|
9
10
|
version?: string;
|
|
10
11
|
};
|
|
11
12
|
export declare function createMigmaMcpServer(options?: CreateMigmaMcpServerOptions): McpServer;
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAgBnC,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,KAAK,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAqBF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG,SAAS,CA2BzF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEzD;AAGD,wBAAgB,mBAAmB,cAOlC"}
|
package/build/index.js
CHANGED
|
@@ -16,6 +16,7 @@ import { registerTagTools } from "./tools/tags.js";
|
|
|
16
16
|
import { registerSegmentTools } from "./tools/segments.js";
|
|
17
17
|
import { registerWebhookTools } from "./tools/webhooks.js";
|
|
18
18
|
import { registerCampaignTools } from "./tools/campaigns.js";
|
|
19
|
+
import { registerMetricsTools } from "./tools/metrics.js";
|
|
19
20
|
import { registerCapabilitiesTool } from "./tools/capabilities.js";
|
|
20
21
|
import { registerMigmaPrompts } from "./prompts/index.js";
|
|
21
22
|
function completeConfig(config) {
|
|
@@ -37,22 +38,24 @@ function createLazyClient(config, clientFactory) {
|
|
|
37
38
|
export function createMigmaMcpServer(options = {}) {
|
|
38
39
|
const config = completeConfig(options.config);
|
|
39
40
|
const lazyClient = options.client || createLazyClient(config, options.getClient);
|
|
41
|
+
const { permissions } = options;
|
|
40
42
|
const { version } = createRequire(import.meta.url)("../package.json");
|
|
41
43
|
const server = new McpServer({
|
|
42
44
|
name: "migma",
|
|
43
45
|
version: options.version || version,
|
|
44
46
|
});
|
|
45
|
-
registerProjectTools(server, lazyClient, config);
|
|
46
|
-
registerGenerateTools(server, lazyClient, config);
|
|
47
|
-
registerSendTools(server, lazyClient, config);
|
|
48
|
-
registerValidateTools(server, lazyClient);
|
|
49
|
-
registerExportTools(server, lazyClient);
|
|
50
|
-
registerDomainTools(server, lazyClient);
|
|
51
|
-
registerContactTools(server, lazyClient, config);
|
|
52
|
-
registerTagTools(server, lazyClient, config);
|
|
53
|
-
registerSegmentTools(server, lazyClient, config);
|
|
54
|
-
registerWebhookTools(server, lazyClient);
|
|
55
|
-
registerCampaignTools(server, lazyClient, config);
|
|
47
|
+
registerProjectTools(server, lazyClient, config, permissions);
|
|
48
|
+
registerGenerateTools(server, lazyClient, config, permissions);
|
|
49
|
+
registerSendTools(server, lazyClient, config, permissions);
|
|
50
|
+
registerValidateTools(server, lazyClient, permissions);
|
|
51
|
+
registerExportTools(server, lazyClient, permissions);
|
|
52
|
+
registerDomainTools(server, lazyClient, permissions);
|
|
53
|
+
registerContactTools(server, lazyClient, config, permissions);
|
|
54
|
+
registerTagTools(server, lazyClient, config, permissions);
|
|
55
|
+
registerSegmentTools(server, lazyClient, config, permissions);
|
|
56
|
+
registerWebhookTools(server, lazyClient, permissions);
|
|
57
|
+
registerCampaignTools(server, lazyClient, config, permissions);
|
|
58
|
+
registerMetricsTools(server, lazyClient, permissions);
|
|
56
59
|
registerMigmaPrompts(server);
|
|
57
60
|
// Register last so the catalog reflects every tool above it.
|
|
58
61
|
registerCapabilitiesTool(server);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AASA,wBAAgB,MAAM,CACpB,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAMT"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const READ_PERMISSIONS = new Set([
|
|
2
|
+
"email:read",
|
|
3
|
+
"campaign:read",
|
|
4
|
+
"audience:read",
|
|
5
|
+
"domain:read",
|
|
6
|
+
"webhook:read",
|
|
7
|
+
"email:validate",
|
|
8
|
+
]);
|
|
9
|
+
export function canUse(granted, required) {
|
|
10
|
+
if (granted === undefined)
|
|
11
|
+
return true;
|
|
12
|
+
if (required.length > 0 && required.every((permission) => READ_PERMISSIONS.has(permission))) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return required.every((permission) => granted.includes(permission));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,YAAY;IACZ,eAAe;IACf,eAAe;IACf,aAAa;IACb,cAAc;IACd,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,UAAU,MAAM,CACpB,OAA6B,EAC7B,QAAkB;IAElB,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -2,19 +2,17 @@ import assert from "node:assert/strict";
|
|
|
2
2
|
import test from "node:test";
|
|
3
3
|
import { createMigmaMcpServer } from "../../index.js";
|
|
4
4
|
import { TOOL_CATALOG } from "../capabilities.js";
|
|
5
|
-
|
|
6
|
-
* Guards against catalog drift: every tool the server actually registers must
|
|
7
|
-
* have a TOOL_CATALOG entry, and the catalog must not list tools that don't
|
|
8
|
-
* exist. The server exposes registrations on the private `_registeredTools`
|
|
9
|
-
* map, which we read here purely for the test.
|
|
10
|
-
*/
|
|
11
|
-
function registeredToolNames() {
|
|
5
|
+
function registeredTools(permissions) {
|
|
12
6
|
const server = createMigmaMcpServer({
|
|
13
7
|
config: { apiKey: "sk_live_test" },
|
|
8
|
+
permissions,
|
|
14
9
|
});
|
|
15
|
-
|
|
16
|
-
return Object.keys(registered);
|
|
10
|
+
return server._registeredTools;
|
|
17
11
|
}
|
|
12
|
+
function registeredToolNames(permissions) {
|
|
13
|
+
return Object.keys(registeredTools(permissions));
|
|
14
|
+
}
|
|
15
|
+
const READ_TOOL_NAMES = TOOL_CATALOG.filter((entry) => !entry.write).map((entry) => entry.name);
|
|
18
16
|
test("TOOL_CATALOG matches the registered tool set exactly", () => {
|
|
19
17
|
const registered = new Set(registeredToolNames());
|
|
20
18
|
const catalog = new Set(TOOL_CATALOG.map((entry) => entry.name));
|
|
@@ -24,4 +22,17 @@ test("TOOL_CATALOG matches the registered tool set exactly", () => {
|
|
|
24
22
|
assert.deepEqual(extraInCatalog, [], `TOOL_CATALOG entries that aren't registered: ${extraInCatalog.join(", ")}`);
|
|
25
23
|
assert.equal(catalog.size, TOOL_CATALOG.length, "TOOL_CATALOG has duplicate names");
|
|
26
24
|
});
|
|
25
|
+
test("read tools register even when only email:read is granted", () => {
|
|
26
|
+
const emailReadTools = registeredToolNames(["email:read"]).sort();
|
|
27
|
+
assert.deepEqual(emailReadTools, [...READ_TOOL_NAMES].sort());
|
|
28
|
+
assert.equal(emailReadTools.includes("migma_send_email"), false);
|
|
29
|
+
assert.equal(emailReadTools.includes("migma_create_webhook"), false);
|
|
30
|
+
assert.equal(registeredToolNames().length, TOOL_CATALOG.length);
|
|
31
|
+
});
|
|
32
|
+
test("read tools advertise readOnlyHint", () => {
|
|
33
|
+
const registered = registeredTools(["email:read"]);
|
|
34
|
+
for (const name of READ_TOOL_NAMES) {
|
|
35
|
+
assert.equal(registered[name]?.annotations?.readOnlyHint, true, `${name} should set readOnlyHint`);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
27
38
|
//# sourceMappingURL=catalog.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/catalog.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/catalog.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { Migma } from "migma";
|
|
3
3
|
import type { Config } from "../config.js";
|
|
4
|
-
export declare function registerCampaignTools(server: McpServer, client: Migma, config: Config): void;
|
|
4
|
+
export declare function registerCampaignTools(server: McpServer, client: Migma, config: Config, grantedPermissions?: string[]): void;
|
|
5
5
|
//# sourceMappingURL=campaigns.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"campaigns.d.ts","sourceRoot":"","sources":["../../src/tools/campaigns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"campaigns.d.ts","sourceRoot":"","sources":["../../src/tools/campaigns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQ3C,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAwT9B"}
|