@illicomedia/skills-mcp-server 1.0.1 → 1.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.
Potentially problematic release.
This version of @illicomedia/skills-mcp-server might be problematic. Click here for more details.
- package/README.md +0 -0
- package/dist/audit.d.ts +0 -0
- package/dist/audit.js +0 -0
- package/dist/catalog.d.ts +0 -0
- package/dist/catalog.js +0 -0
- package/dist/executor.d.ts +0 -0
- package/dist/executor.js +21 -13
- package/dist/index.d.ts +0 -0
- package/dist/index.js +0 -0
- package/dist/installer.d.ts +0 -0
- package/dist/installer.js +0 -0
- package/dist/license-keys.d.ts +1 -1
- package/dist/license-keys.js +3 -3
- package/dist/license-templates.d.ts +0 -0
- package/dist/license-templates.js +1 -1
- package/dist/license.d.ts +4 -0
- package/dist/license.js +20 -2
- package/dist/server.d.ts +0 -0
- package/dist/server.js +2 -1
- package/dist/tools.d.ts +0 -0
- package/dist/tools.js +0 -0
- package/dist/types.d.ts +0 -0
- package/dist/types.js +0 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +5 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
File without changes
|
package/dist/audit.d.ts
CHANGED
|
File without changes
|
package/dist/audit.js
CHANGED
|
File without changes
|
package/dist/catalog.d.ts
CHANGED
|
File without changes
|
package/dist/catalog.js
CHANGED
|
File without changes
|
package/dist/executor.d.ts
CHANGED
|
File without changes
|
package/dist/executor.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { runComplianceAudit } from './audit.js';
|
|
4
4
|
import { SKILLS_CATALOG, getAvailableSkills, loadSkillContent } from './catalog.js';
|
|
5
5
|
import { installSkill, syncWorkspaceSkills } from './installer.js';
|
|
6
|
-
import { generateCanaryWatermark, validateLicense } from './license.js';
|
|
6
|
+
import { PRICING_URL, PROJECT_LICENSE_FILE, generateCanaryWatermark, validateLicense, } from './license.js';
|
|
7
7
|
export class ToolExecutor {
|
|
8
8
|
static execute(name, args, activeLicenseKey, onLicenseUpdate, licenseOptions = {}) {
|
|
9
9
|
if (args.license_key && typeof args.license_key === 'string') {
|
|
@@ -46,20 +46,28 @@ export class ToolExecutor {
|
|
|
46
46
|
}, null, 2);
|
|
47
47
|
}
|
|
48
48
|
case 'list_skills': {
|
|
49
|
-
const
|
|
49
|
+
const accessibleIds = new Set(getAvailableSkills(license.tier).map((s) => s.id));
|
|
50
50
|
const categoryFilter = args.category;
|
|
51
|
-
const
|
|
52
|
-
?
|
|
53
|
-
:
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
? `\n> [!NOTE] Running on Free Foundation tier (${freeCount} MIT skills). Upgrade to Pro or Enterprise at https://www.illicomedia.com/qa-skills/pricing to unlock all ${totalCount} skills.\n`
|
|
51
|
+
const listed = categoryFilter
|
|
52
|
+
? SKILLS_CATALOG.filter((s) => s.category === categoryFilter)
|
|
53
|
+
: SKILLS_CATALOG;
|
|
54
|
+
const accessibleCount = listed.filter((s) => accessibleIds.has(s.id)).length;
|
|
55
|
+
const advisory = accessibleCount < listed.length
|
|
56
|
+
? `\n> [!NOTE] ${license.message}\n> Skills marked 🔒 require a signed Pro or Enterprise license file (${PROJECT_LICENSE_FILE}). Plans: ${PRICING_URL}\n`
|
|
58
57
|
: '';
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
.
|
|
62
|
-
|
|
58
|
+
const cell = (value) => value.replace(/\|/g, '\\|').replace(/\s+/g, ' ');
|
|
59
|
+
const rows = listed.map((s) => {
|
|
60
|
+
const access = accessibleIds.has(s.id)
|
|
61
|
+
? '✅ Available'
|
|
62
|
+
: `🔒 Requires ${s.tier === 'enterprise' ? 'Enterprise' : 'Pro'} license`;
|
|
63
|
+
return `| \`${s.id}\` | ${s.tier.toUpperCase()} | ${access} | ${s.category} | ${cell(s.name)}: ${cell(s.description)} |`;
|
|
64
|
+
});
|
|
65
|
+
const table = [
|
|
66
|
+
'| Skill | Tier | Access | Category | Description |',
|
|
67
|
+
'| --- | --- | --- | --- | --- |',
|
|
68
|
+
...rows,
|
|
69
|
+
].join('\n');
|
|
70
|
+
return `# Fredo QA Skills catalog (${accessibleCount} accessible under ${license.tier.toUpperCase()} plan, ${listed.length} listed)\n${advisory}\n${table}`;
|
|
63
71
|
}
|
|
64
72
|
case 'get_skill_rules': {
|
|
65
73
|
const skillId = args.skill_id;
|
package/dist/index.d.ts
CHANGED
|
File without changes
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/installer.d.ts
CHANGED
|
File without changes
|
package/dist/installer.js
CHANGED
|
File without changes
|
package/dist/license-keys.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ export declare const TRUSTED_LICENSE_KEYS: Readonly<Record<string, string>>;
|
|
|
8
8
|
* Release date of this build. A license unlocks this build only when its
|
|
9
9
|
* `updates_until` is on or after this date (version retention).
|
|
10
10
|
*/
|
|
11
|
-
export declare const SERVER_RELEASE_DATE = "2026-10-
|
|
11
|
+
export declare const SERVER_RELEASE_DATE = "2026-10-23T00:00:00Z";
|
package/dist/license-keys.js
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
* While this map is empty, no paid license verifies and the server runs in free mode.
|
|
7
7
|
*/
|
|
8
8
|
export const TRUSTED_LICENSE_KEYS = Object.freeze({
|
|
9
|
-
'fredo-qa-
|
|
10
|
-
|
|
9
|
+
'fredo-qa-2026-10': `-----BEGIN PUBLIC KEY-----
|
|
10
|
+
MCowBQYDK2VwAyEAPrQoO+oWLJAO81k/6uR0tRZGsDVmkvrc6CCHzO1YfpU=
|
|
11
11
|
-----END PUBLIC KEY-----`,
|
|
12
12
|
});
|
|
13
13
|
/**
|
|
14
14
|
* Release date of this build. A license unlocks this build only when its
|
|
15
15
|
* `updates_until` is on or after this date (version retention).
|
|
16
16
|
*/
|
|
17
|
-
export const SERVER_RELEASE_DATE = '2026-10-
|
|
17
|
+
export const SERVER_RELEASE_DATE = '2026-10-23T00:00:00Z';
|
|
File without changes
|
|
@@ -66,7 +66,7 @@ export function resolveSkillLicense(meta, license, searchDir) {
|
|
|
66
66
|
if (meta.tier === 'free') {
|
|
67
67
|
return content;
|
|
68
68
|
}
|
|
69
|
-
return `${content}\n\n---\nCOMMERCIAL ACTIVATION
|
|
69
|
+
return `${content}\n\n---\nCOMMERCIAL LICENSE ACTIVATION\nLicensee: ${license.customerName || 'Licensed Organization'}\nLicense Tier: ${meta.tier.toUpperCase()}\nLicense: ${license.licenseId || 'unknown'} (Ed25519 signature verified)\nUpdates Until: ${license.updatesUntil || 'unknown'}\nAuthorized by: Frédéric Charles Viallet (www.illicomedia.com/qa-skills/)`;
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
catch {
|
package/dist/license.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { LicenseValidationResult } from './types.js';
|
|
2
|
+
export declare const PRICING_URL = "https://www.illicomedia.com/qa-skills/pricing";
|
|
3
|
+
/** License file format version understood by this build (see LICENSE_SCHEMA_URL). */
|
|
4
|
+
export declare const LICENSE_SCHEMA_VERSION = 1;
|
|
5
|
+
export declare const LICENSE_SCHEMA_URL = "https://www.illicomedia.com/schemas/qa-license-v1.schema.json";
|
|
2
6
|
export declare const LICENSE_FILE_ENV = "FREDO_QA_LICENSE_FILE";
|
|
3
7
|
export declare const USER_LICENSE_PATH: string[];
|
|
4
8
|
export declare const PROJECT_LICENSE_FILE = ".qa-license.json";
|
package/dist/license.js
CHANGED
|
@@ -6,7 +6,7 @@ import * as os from 'node:os';
|
|
|
6
6
|
import * as path from 'node:path';
|
|
7
7
|
import { SERVER_RELEASE_DATE, TRUSTED_LICENSE_KEYS } from './license-keys.js';
|
|
8
8
|
const HMAC_SALT = 'fredo-qa-skills-provenance-v1';
|
|
9
|
-
const PRICING_URL = 'https://www.illicomedia.com/qa-skills/pricing';
|
|
9
|
+
export const PRICING_URL = 'https://www.illicomedia.com/qa-skills/pricing';
|
|
10
10
|
const MAX_LICENSE_BYTES = 64 * 1024;
|
|
11
11
|
const ISO_INSTANT = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/;
|
|
12
12
|
const BASE64 = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
@@ -19,7 +19,17 @@ const STRING_FIELDS = [
|
|
|
19
19
|
'key_id',
|
|
20
20
|
'signature',
|
|
21
21
|
];
|
|
22
|
-
const ALLOWED_FIELDS = new Set([
|
|
22
|
+
const ALLOWED_FIELDS = new Set([
|
|
23
|
+
...STRING_FIELDS,
|
|
24
|
+
'tier',
|
|
25
|
+
'seats',
|
|
26
|
+
'binding',
|
|
27
|
+
'schema_version',
|
|
28
|
+
'$schema',
|
|
29
|
+
]);
|
|
30
|
+
/** License file format version understood by this build (see LICENSE_SCHEMA_URL). */
|
|
31
|
+
export const LICENSE_SCHEMA_VERSION = 1;
|
|
32
|
+
export const LICENSE_SCHEMA_URL = 'https://www.illicomedia.com/schemas/qa-license-v1.schema.json';
|
|
23
33
|
export const LICENSE_FILE_ENV = 'FREDO_QA_LICENSE_FILE';
|
|
24
34
|
export const USER_LICENSE_PATH = ['.config', 'fredo-qa', 'license.json'];
|
|
25
35
|
export const PROJECT_LICENSE_FILE = '.qa-license.json';
|
|
@@ -76,6 +86,14 @@ function parseLicense(text) {
|
|
|
76
86
|
return 'license file must contain a JSON object';
|
|
77
87
|
}
|
|
78
88
|
const record = data;
|
|
89
|
+
if (record.schema_version !== LICENSE_SCHEMA_VERSION) {
|
|
90
|
+
return Number.isInteger(record.schema_version) && record.schema_version > LICENSE_SCHEMA_VERSION
|
|
91
|
+
? `license format version ${String(record.schema_version)} requires a newer MCP server (this build reads version ${LICENSE_SCHEMA_VERSION}); update the MCP server`
|
|
92
|
+
: `license schema_version must be ${LICENSE_SCHEMA_VERSION}`;
|
|
93
|
+
}
|
|
94
|
+
if (record.$schema !== undefined && record.$schema !== LICENSE_SCHEMA_URL) {
|
|
95
|
+
return `license $schema must be ${LICENSE_SCHEMA_URL}`;
|
|
96
|
+
}
|
|
79
97
|
const unknownField = Object.keys(record).find((key) => !ALLOWED_FIELDS.has(key));
|
|
80
98
|
if (unknownField) {
|
|
81
99
|
return `license field '${unknownField}' is not supported`;
|
package/dist/server.d.ts
CHANGED
|
File without changes
|
package/dist/server.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import * as readline from 'node:readline';
|
|
4
4
|
import { ToolExecutor } from './executor.js';
|
|
5
5
|
import { MCP_TOOLS, findToolDefinition, validateToolParams } from './tools.js';
|
|
6
|
+
import { SERVER_VERSION } from './version.js';
|
|
6
7
|
export { MCP_TOOLS };
|
|
7
8
|
export const DEFAULT_API_ENDPOINT = process.env.FREDO_QA_API_URL || 'https://www.illicomedia.com/api';
|
|
8
9
|
export class FredoQaMcpServer {
|
|
@@ -33,7 +34,7 @@ export class FredoQaMcpServer {
|
|
|
33
34
|
},
|
|
34
35
|
serverInfo: {
|
|
35
36
|
name: '@illicomedia/skills-mcp-server',
|
|
36
|
-
version:
|
|
37
|
+
version: SERVER_VERSION,
|
|
37
38
|
description: 'Official Fredo QA Skills Model Context Protocol Server',
|
|
38
39
|
},
|
|
39
40
|
},
|
package/dist/tools.d.ts
CHANGED
|
File without changes
|
package/dist/tools.js
CHANGED
|
File without changes
|
package/dist/types.d.ts
CHANGED
|
File without changes
|
package/dist/types.js
CHANGED
|
File without changes
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 Frédéric Charles Viallet
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
/** Version of this package, read from the package.json shipped next to dist/ (single source of truth). */
|
|
5
|
+
export const SERVER_VERSION = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@illicomedia/skills-mcp-server",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Official Fredo QA Skills Model Context Protocol (MCP) Server for Cursor, Claude Desktop, Antigravity, and Copilot",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|