@shuji-bonji/w3c-mcp 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.ja.md +246 -0
- package/README.md +246 -0
- package/dist/data/loader.d.ts +88 -0
- package/dist/data/loader.d.ts.map +1 -0
- package/dist/data/loader.js +165 -0
- package/dist/data/loader.js.map +1 -0
- package/dist/errors/index.d.ts +50 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +116 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +307 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/index.d.ts +97 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +53 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/tools/get-css.d.ts +30 -0
- package/dist/tools/get-css.d.ts.map +1 -0
- package/dist/tools/get-css.js +99 -0
- package/dist/tools/get-css.js.map +1 -0
- package/dist/tools/get-elements.d.ts +14 -0
- package/dist/tools/get-elements.d.ts.map +1 -0
- package/dist/tools/get-elements.js +56 -0
- package/dist/tools/get-elements.js.map +1 -0
- package/dist/tools/get-pwa-specs.d.ts +10 -0
- package/dist/tools/get-pwa-specs.d.ts.map +1 -0
- package/dist/tools/get-pwa-specs.js +100 -0
- package/dist/tools/get-pwa-specs.js.map +1 -0
- package/dist/tools/get-spec.d.ts +10 -0
- package/dist/tools/get-spec.d.ts.map +1 -0
- package/dist/tools/get-spec.js +58 -0
- package/dist/tools/get-spec.js.map +1 -0
- package/dist/tools/get-webidl.d.ts +9 -0
- package/dist/tools/get-webidl.d.ts.map +1 -0
- package/dist/tools/get-webidl.js +50 -0
- package/dist/tools/get-webidl.js.map +1 -0
- package/dist/tools/list-specs.d.ts +6 -0
- package/dist/tools/list-specs.d.ts.map +1 -0
- package/dist/tools/list-specs.js +38 -0
- package/dist/tools/list-specs.js.map +1 -0
- package/dist/tools/search-specs.d.ts +16 -0
- package/dist/tools/search-specs.d.ts.map +1 -0
- package/dist/tools/search-specs.js +117 -0
- package/dist/tools/search-specs.js.map +1 -0
- package/dist/types/index.d.ts +85 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +49 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +113 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get WebIDL definitions for a specification
|
|
3
|
+
*/
|
|
4
|
+
import { loadWebIDLRaw, findSpec, loadSpecs } from '../data/loader.js';
|
|
5
|
+
export async function getWebIDL(shortname) {
|
|
6
|
+
const idlData = await loadWebIDLRaw();
|
|
7
|
+
// Try exact match first
|
|
8
|
+
if (idlData[shortname]) {
|
|
9
|
+
return idlData[shortname];
|
|
10
|
+
}
|
|
11
|
+
// Try finding the spec to get its proper shortname
|
|
12
|
+
const spec = await findSpec(shortname);
|
|
13
|
+
if (spec && idlData[spec.shortname]) {
|
|
14
|
+
return idlData[spec.shortname];
|
|
15
|
+
}
|
|
16
|
+
// Try series shortname
|
|
17
|
+
if (spec?.series?.shortname && idlData[spec.series.shortname]) {
|
|
18
|
+
return idlData[spec.series.shortname];
|
|
19
|
+
}
|
|
20
|
+
// Try partial match
|
|
21
|
+
const matchingKeys = Object.keys(idlData).filter(key => key.includes(shortname) || shortname.includes(key));
|
|
22
|
+
if (matchingKeys.length === 1) {
|
|
23
|
+
return idlData[matchingKeys[0]];
|
|
24
|
+
}
|
|
25
|
+
if (matchingKeys.length > 1) {
|
|
26
|
+
throw new Error(`Multiple WebIDL matches found for "${shortname}": ${matchingKeys.join(', ')}. ` +
|
|
27
|
+
'Please specify the exact shortname.');
|
|
28
|
+
}
|
|
29
|
+
// No match found
|
|
30
|
+
const specs = await loadSpecs();
|
|
31
|
+
const suggestions = specs
|
|
32
|
+
.filter(s => idlData[s.shortname])
|
|
33
|
+
.filter(s => s.shortname.includes(shortname) ||
|
|
34
|
+
shortname.includes(s.shortname) ||
|
|
35
|
+
s.title.toLowerCase().includes(shortname.toLowerCase()))
|
|
36
|
+
.slice(0, 5)
|
|
37
|
+
.map(s => s.shortname);
|
|
38
|
+
throw new Error(`WebIDL not found for "${shortname}".` +
|
|
39
|
+
(suggestions.length > 0
|
|
40
|
+
? ` Specs with WebIDL that might match: ${suggestions.join(', ')}`
|
|
41
|
+
: ' This specification might not have WebIDL definitions.'));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* List all specifications that have WebIDL definitions
|
|
45
|
+
*/
|
|
46
|
+
export async function listWebIDLSpecs() {
|
|
47
|
+
const idlData = await loadWebIDLRaw();
|
|
48
|
+
return Object.keys(idlData).sort();
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=get-webidl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-webidl.js","sourceRoot":"","sources":["../../src/tools/get-webidl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IAEtC,wBAAwB;IACxB,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IAED,mDAAmD;IACnD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAI,EAAE,MAAM,EAAE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB;IACpB,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrD,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CACnD,CAAC;IAEF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAChF,qCAAqC,CACtC,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,KAAK;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CACV,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC/B,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/B,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CACxD;SACA,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEzB,MAAM,IAAI,KAAK,CACb,yBAAyB,SAAS,IAAI;QACtC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YACrB,CAAC,CAAC,wCAAwC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAClE,CAAC,CAAC,wDAAwD,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-specs.d.ts","sourceRoot":"","sources":["../../src/tools/list-specs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEvE,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA4CtF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List W3C/WHATWG/IETF web specifications
|
|
3
|
+
*/
|
|
4
|
+
import { loadSpecs } from '../data/loader.js';
|
|
5
|
+
export async function listSpecs(options = {}) {
|
|
6
|
+
const { organization, keyword, category, limit = 50 } = options;
|
|
7
|
+
let specs = await loadSpecs();
|
|
8
|
+
// Filter by organization
|
|
9
|
+
if (organization && organization !== 'all') {
|
|
10
|
+
specs = specs.filter(spec => {
|
|
11
|
+
const specOrg = spec.organization?.toUpperCase();
|
|
12
|
+
return specOrg === organization.toUpperCase();
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
// Filter by keyword in title or shortname
|
|
16
|
+
if (keyword) {
|
|
17
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
18
|
+
specs = specs.filter(spec => spec.title.toLowerCase().includes(lowerKeyword) ||
|
|
19
|
+
spec.shortname.toLowerCase().includes(lowerKeyword));
|
|
20
|
+
}
|
|
21
|
+
// Filter by category (if available in spec data)
|
|
22
|
+
if (category) {
|
|
23
|
+
specs = specs.filter(spec => spec.categories?.some(cat => cat.toLowerCase().includes(category.toLowerCase())));
|
|
24
|
+
}
|
|
25
|
+
// Limit results
|
|
26
|
+
specs = specs.slice(0, limit);
|
|
27
|
+
// Map to summary format
|
|
28
|
+
return specs.map(spec => ({
|
|
29
|
+
shortname: spec.shortname,
|
|
30
|
+
title: spec.title,
|
|
31
|
+
url: spec.url,
|
|
32
|
+
nightlyUrl: spec.nightly?.url,
|
|
33
|
+
organization: spec.organization,
|
|
34
|
+
status: spec.release?.status || spec.nightly?.status,
|
|
35
|
+
categories: spec.categories
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=list-specs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-specs.js","sourceRoot":"","sources":["../../src/tools/list-specs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAA4B,EAAE;IAC5D,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAEhE,IAAI,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAE9B,yBAAyB;IACzB,IAAI,YAAY,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3C,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;YACjD,OAAO,OAAO,KAAK,YAAY,CAAC,WAAW,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0CAA0C;IAC1C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC1B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC1B,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAC1B,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CACnD,CACF,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE9B,wBAAwB;IACxB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG;QAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM;QACpD,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search web specifications by query
|
|
3
|
+
*
|
|
4
|
+
* Performance improvements:
|
|
5
|
+
* - Early termination for exact matches
|
|
6
|
+
* - Score threshold to skip low-relevance results
|
|
7
|
+
* - Optimized string operations
|
|
8
|
+
*/
|
|
9
|
+
import type { SpecSearchResult } from '../types/index.js';
|
|
10
|
+
export declare function searchSpecs(query: string, limit?: number): Promise<SpecSearchResult[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Quick search for exact shortname match
|
|
13
|
+
* O(1) with index - use when you know exact shortname
|
|
14
|
+
*/
|
|
15
|
+
export declare function quickFindByShortname(shortname: string): Promise<SpecSearchResult | null>;
|
|
16
|
+
//# sourceMappingURL=search-specs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-specs.d.ts","sourceRoot":"","sources":["../../src/tools/search-specs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK1D,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2FhG;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAgB9F"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search web specifications by query
|
|
3
|
+
*
|
|
4
|
+
* Performance improvements:
|
|
5
|
+
* - Early termination for exact matches
|
|
6
|
+
* - Score threshold to skip low-relevance results
|
|
7
|
+
* - Optimized string operations
|
|
8
|
+
*/
|
|
9
|
+
import { loadSpecs } from '../data/loader.js';
|
|
10
|
+
// Pre-compile common patterns
|
|
11
|
+
const WORD_SPLIT_REGEX = /\s+/;
|
|
12
|
+
export async function searchSpecs(query, limit = 20) {
|
|
13
|
+
const specs = await loadSpecs();
|
|
14
|
+
const lowerQuery = query.toLowerCase();
|
|
15
|
+
const queryWords = lowerQuery.split(WORD_SPLIT_REGEX).filter(w => w.length > 2);
|
|
16
|
+
const results = [];
|
|
17
|
+
// Track if we found a perfect match - can optimize further iterations
|
|
18
|
+
let foundPerfectMatch = false;
|
|
19
|
+
for (const spec of specs) {
|
|
20
|
+
const lowerShortname = spec.shortname.toLowerCase();
|
|
21
|
+
const lowerTitle = spec.title.toLowerCase();
|
|
22
|
+
let score = 0;
|
|
23
|
+
let matchType = 'title';
|
|
24
|
+
// Exact shortname match (highest score) - early optimization
|
|
25
|
+
if (lowerShortname === lowerQuery) {
|
|
26
|
+
score = 100;
|
|
27
|
+
matchType = 'shortname';
|
|
28
|
+
foundPerfectMatch = true;
|
|
29
|
+
}
|
|
30
|
+
// Shortname contains query
|
|
31
|
+
else if (lowerShortname.includes(lowerQuery)) {
|
|
32
|
+
score = 80;
|
|
33
|
+
matchType = 'shortname';
|
|
34
|
+
}
|
|
35
|
+
// Query contains shortname (only for meaningful shortnames)
|
|
36
|
+
else if (lowerShortname.length > 3 && lowerQuery.includes(lowerShortname)) {
|
|
37
|
+
score = 70;
|
|
38
|
+
matchType = 'shortname';
|
|
39
|
+
}
|
|
40
|
+
// Exact title match
|
|
41
|
+
else if (lowerTitle === lowerQuery) {
|
|
42
|
+
score = 90;
|
|
43
|
+
matchType = 'title';
|
|
44
|
+
}
|
|
45
|
+
// Title contains query
|
|
46
|
+
else if (lowerTitle.includes(lowerQuery)) {
|
|
47
|
+
score = 60;
|
|
48
|
+
matchType = 'title';
|
|
49
|
+
}
|
|
50
|
+
// Word-based matching
|
|
51
|
+
else if (queryWords.length > 0) {
|
|
52
|
+
const matchedWords = queryWords.filter(word => lowerTitle.includes(word));
|
|
53
|
+
if (matchedWords.length === queryWords.length) {
|
|
54
|
+
// All words match
|
|
55
|
+
score = 50;
|
|
56
|
+
matchType = 'title';
|
|
57
|
+
}
|
|
58
|
+
else if (matchedWords.length > 0) {
|
|
59
|
+
// Some words match
|
|
60
|
+
score = 30 + (matchedWords.length / queryWords.length) * 20;
|
|
61
|
+
matchType = 'title';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Abstract/description match (lower priority) - only check if no other match
|
|
65
|
+
if (score === 0 && spec.abstract) {
|
|
66
|
+
const lowerAbstract = spec.abstract.toLowerCase();
|
|
67
|
+
if (lowerAbstract.includes(lowerQuery)) {
|
|
68
|
+
score = 25;
|
|
69
|
+
matchType = 'description';
|
|
70
|
+
}
|
|
71
|
+
else if (queryWords.length > 0) {
|
|
72
|
+
const matchedWords = queryWords.filter(word => lowerAbstract.includes(word));
|
|
73
|
+
if (matchedWords.length >= queryWords.length / 2) {
|
|
74
|
+
score = 15 + (matchedWords.length / queryWords.length) * 10;
|
|
75
|
+
matchType = 'description';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Only add results with meaningful scores
|
|
80
|
+
if (score > 0) {
|
|
81
|
+
results.push({
|
|
82
|
+
shortname: spec.shortname,
|
|
83
|
+
title: spec.title,
|
|
84
|
+
url: spec.url,
|
|
85
|
+
nightlyUrl: spec.nightly?.url,
|
|
86
|
+
organization: spec.organization,
|
|
87
|
+
status: spec.release?.status || spec.nightly?.status,
|
|
88
|
+
matchType,
|
|
89
|
+
score
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Sort by score descending
|
|
94
|
+
results.sort((a, b) => b.score - a.score);
|
|
95
|
+
return results.slice(0, limit);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Quick search for exact shortname match
|
|
99
|
+
* O(1) with index - use when you know exact shortname
|
|
100
|
+
*/
|
|
101
|
+
export async function quickFindByShortname(shortname) {
|
|
102
|
+
const { findSpec } = await import('../data/loader.js');
|
|
103
|
+
const spec = await findSpec(shortname);
|
|
104
|
+
if (!spec)
|
|
105
|
+
return null;
|
|
106
|
+
return {
|
|
107
|
+
shortname: spec.shortname,
|
|
108
|
+
title: spec.title,
|
|
109
|
+
url: spec.url,
|
|
110
|
+
nightlyUrl: spec.nightly?.url,
|
|
111
|
+
organization: spec.organization,
|
|
112
|
+
status: spec.release?.status || spec.nightly?.status,
|
|
113
|
+
matchType: 'shortname',
|
|
114
|
+
score: 100
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=search-specs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-specs.js","sourceRoot":"","sources":["../../src/tools/search-specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for W3C MCP Server
|
|
3
|
+
*/
|
|
4
|
+
export interface SpecSummary {
|
|
5
|
+
shortname: string;
|
|
6
|
+
title: string;
|
|
7
|
+
url: string;
|
|
8
|
+
nightlyUrl?: string;
|
|
9
|
+
organization?: string;
|
|
10
|
+
status?: string;
|
|
11
|
+
categories?: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface SpecDetail extends SpecSummary {
|
|
14
|
+
abstract?: string;
|
|
15
|
+
repository?: string;
|
|
16
|
+
tests?: {
|
|
17
|
+
repository?: string;
|
|
18
|
+
testPaths?: string[];
|
|
19
|
+
};
|
|
20
|
+
release?: {
|
|
21
|
+
url: string;
|
|
22
|
+
status?: string;
|
|
23
|
+
};
|
|
24
|
+
nightly?: {
|
|
25
|
+
url: string;
|
|
26
|
+
status?: string;
|
|
27
|
+
};
|
|
28
|
+
series?: {
|
|
29
|
+
shortname: string;
|
|
30
|
+
currentSpecification?: string;
|
|
31
|
+
};
|
|
32
|
+
source?: string;
|
|
33
|
+
standing?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface SpecSearchResult extends SpecSummary {
|
|
36
|
+
matchType: 'title' | 'shortname' | 'description';
|
|
37
|
+
score: number;
|
|
38
|
+
}
|
|
39
|
+
export interface CSSProperty {
|
|
40
|
+
name: string;
|
|
41
|
+
value?: string;
|
|
42
|
+
initial?: string;
|
|
43
|
+
appliesTo?: string;
|
|
44
|
+
inherited?: string;
|
|
45
|
+
percentages?: string;
|
|
46
|
+
computedValue?: string;
|
|
47
|
+
animationType?: string;
|
|
48
|
+
spec: string;
|
|
49
|
+
}
|
|
50
|
+
export interface CSSValue {
|
|
51
|
+
name: string;
|
|
52
|
+
value?: string;
|
|
53
|
+
type?: string;
|
|
54
|
+
spec: string;
|
|
55
|
+
}
|
|
56
|
+
export interface ElementDefinition {
|
|
57
|
+
name: string;
|
|
58
|
+
interface?: string;
|
|
59
|
+
categories?: string[];
|
|
60
|
+
contentModel?: string;
|
|
61
|
+
attributes?: AttributeDefinition[];
|
|
62
|
+
spec: string;
|
|
63
|
+
}
|
|
64
|
+
export interface AttributeDefinition {
|
|
65
|
+
name: string;
|
|
66
|
+
type?: string;
|
|
67
|
+
description?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface DependencyInfo {
|
|
70
|
+
shortname: string;
|
|
71
|
+
title: string;
|
|
72
|
+
dependencies: string[];
|
|
73
|
+
dependents: string[];
|
|
74
|
+
}
|
|
75
|
+
export interface ListSpecsOptions {
|
|
76
|
+
organization?: 'W3C' | 'WHATWG' | 'IETF' | 'all';
|
|
77
|
+
keyword?: string;
|
|
78
|
+
category?: string;
|
|
79
|
+
limit?: number;
|
|
80
|
+
}
|
|
81
|
+
export interface WebIDLResult {
|
|
82
|
+
shortname: string;
|
|
83
|
+
idl: string;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger utility for W3C MCP Server
|
|
3
|
+
* Provides debug logging controlled by environment variable
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Log debug message (only when W3C_MCP_DEBUG=true)
|
|
7
|
+
*/
|
|
8
|
+
export declare function debug(message: string, data?: unknown): void;
|
|
9
|
+
/**
|
|
10
|
+
* Log info message (always shown)
|
|
11
|
+
*/
|
|
12
|
+
export declare function info(message: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Log warning message (always shown)
|
|
15
|
+
*/
|
|
16
|
+
export declare function warn(message: string, error?: Error): void;
|
|
17
|
+
/**
|
|
18
|
+
* Log error message (always shown)
|
|
19
|
+
*/
|
|
20
|
+
export declare function error(message: string, err?: Error): void;
|
|
21
|
+
/**
|
|
22
|
+
* Performance measurement utilities
|
|
23
|
+
*/
|
|
24
|
+
export declare class PerformanceTimer {
|
|
25
|
+
private startTime;
|
|
26
|
+
private label;
|
|
27
|
+
constructor(label: string);
|
|
28
|
+
/**
|
|
29
|
+
* End the timer and log the duration
|
|
30
|
+
*/
|
|
31
|
+
end(): number;
|
|
32
|
+
/**
|
|
33
|
+
* Log an intermediate checkpoint
|
|
34
|
+
*/
|
|
35
|
+
checkpoint(name: string): number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Decorator-style performance logging
|
|
39
|
+
*/
|
|
40
|
+
export declare function logPerformance<T>(label: string, fn: () => T | Promise<T>): T | Promise<T>;
|
|
41
|
+
/**
|
|
42
|
+
* Log tool invocation (for debugging)
|
|
43
|
+
*/
|
|
44
|
+
export declare function logToolCall(toolName: string, args: unknown): void;
|
|
45
|
+
/**
|
|
46
|
+
* Log tool result (for debugging)
|
|
47
|
+
*/
|
|
48
|
+
export declare function logToolResult(toolName: string, resultSize: number): void;
|
|
49
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAS3D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAMzD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CASxD;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IASzB;;OAEG;IACH,GAAG,IAAI,MAAM;IAUb;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CASjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAchB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAExE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger utility for W3C MCP Server
|
|
3
|
+
* Provides debug logging controlled by environment variable
|
|
4
|
+
*/
|
|
5
|
+
const DEBUG = process.env.W3C_MCP_DEBUG === 'true';
|
|
6
|
+
const LOG_PERFORMANCE = process.env.W3C_MCP_PERF === 'true' || DEBUG;
|
|
7
|
+
/**
|
|
8
|
+
* Log debug message (only when W3C_MCP_DEBUG=true)
|
|
9
|
+
*/
|
|
10
|
+
export function debug(message, data) {
|
|
11
|
+
if (DEBUG) {
|
|
12
|
+
const timestamp = new Date().toISOString();
|
|
13
|
+
if (data !== undefined) {
|
|
14
|
+
console.error(`[${timestamp}] [DEBUG] ${message}`, JSON.stringify(data, null, 2));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.error(`[${timestamp}] [DEBUG] ${message}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Log info message (always shown)
|
|
23
|
+
*/
|
|
24
|
+
export function info(message) {
|
|
25
|
+
console.error(`[INFO] ${message}`);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Log warning message (always shown)
|
|
29
|
+
*/
|
|
30
|
+
export function warn(message, error) {
|
|
31
|
+
if (error) {
|
|
32
|
+
console.error(`[WARN] ${message}:`, error.message);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.error(`[WARN] ${message}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Log error message (always shown)
|
|
40
|
+
*/
|
|
41
|
+
export function error(message, err) {
|
|
42
|
+
if (err) {
|
|
43
|
+
console.error(`[ERROR] ${message}:`, err.message);
|
|
44
|
+
if (DEBUG && err.stack) {
|
|
45
|
+
console.error(err.stack);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.error(`[ERROR] ${message}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Performance measurement utilities
|
|
54
|
+
*/
|
|
55
|
+
export class PerformanceTimer {
|
|
56
|
+
startTime;
|
|
57
|
+
label;
|
|
58
|
+
constructor(label) {
|
|
59
|
+
this.label = label;
|
|
60
|
+
this.startTime = Date.now();
|
|
61
|
+
if (LOG_PERFORMANCE) {
|
|
62
|
+
debug(`${label} started`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* End the timer and log the duration
|
|
67
|
+
*/
|
|
68
|
+
end() {
|
|
69
|
+
const duration = Date.now() - this.startTime;
|
|
70
|
+
if (LOG_PERFORMANCE) {
|
|
71
|
+
console.error(`[PERF] ${this.label}: ${duration}ms`);
|
|
72
|
+
}
|
|
73
|
+
return duration;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Log an intermediate checkpoint
|
|
77
|
+
*/
|
|
78
|
+
checkpoint(name) {
|
|
79
|
+
const duration = Date.now() - this.startTime;
|
|
80
|
+
if (LOG_PERFORMANCE) {
|
|
81
|
+
console.error(`[PERF] ${this.label} → ${name}: ${duration}ms`);
|
|
82
|
+
}
|
|
83
|
+
return duration;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Decorator-style performance logging
|
|
88
|
+
*/
|
|
89
|
+
export function logPerformance(label, fn) {
|
|
90
|
+
if (!LOG_PERFORMANCE) {
|
|
91
|
+
return fn();
|
|
92
|
+
}
|
|
93
|
+
const timer = new PerformanceTimer(label);
|
|
94
|
+
const result = fn();
|
|
95
|
+
if (result instanceof Promise) {
|
|
96
|
+
return result.finally(() => timer.end());
|
|
97
|
+
}
|
|
98
|
+
timer.end();
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Log tool invocation (for debugging)
|
|
103
|
+
*/
|
|
104
|
+
export function logToolCall(toolName, args) {
|
|
105
|
+
debug(`Tool called: ${toolName}`, args);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Log tool result (for debugging)
|
|
109
|
+
*/
|
|
110
|
+
export function logToolResult(toolName, resultSize) {
|
|
111
|
+
debug(`Tool result: ${toolName}`, { resultSize });
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shuji-bonji/w3c-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP Server for accessing W3C Web specifications",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"w3c-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"prepare": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
18
|
+
"web-specs": "latest",
|
|
19
|
+
"@webref/idl": "latest",
|
|
20
|
+
"@webref/css": "latest",
|
|
21
|
+
"@webref/elements": "latest",
|
|
22
|
+
"zod": "^3.23.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^20.0.0",
|
|
26
|
+
"typescript": "^5.5.0"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"mcp",
|
|
30
|
+
"w3c",
|
|
31
|
+
"web-specs",
|
|
32
|
+
"webref",
|
|
33
|
+
"pwa",
|
|
34
|
+
"service-worker",
|
|
35
|
+
"web-standards"
|
|
36
|
+
],
|
|
37
|
+
"author": "shuji-bonji",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/shuji-bonji/w3c-mcp.git"
|
|
42
|
+
},
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/shuji-bonji/w3c-mcp/issues"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/shuji-bonji/w3c-mcp#readme",
|
|
47
|
+
"files": [
|
|
48
|
+
"dist"
|
|
49
|
+
],
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=18.0.0"
|
|
52
|
+
}
|
|
53
|
+
}
|