@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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +246 -0
  3. package/README.md +246 -0
  4. package/dist/data/loader.d.ts +88 -0
  5. package/dist/data/loader.d.ts.map +1 -0
  6. package/dist/data/loader.js +165 -0
  7. package/dist/data/loader.js.map +1 -0
  8. package/dist/errors/index.d.ts +50 -0
  9. package/dist/errors/index.d.ts.map +1 -0
  10. package/dist/errors/index.js +116 -0
  11. package/dist/errors/index.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +307 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/schemas/index.d.ts +97 -0
  17. package/dist/schemas/index.d.ts.map +1 -0
  18. package/dist/schemas/index.js +53 -0
  19. package/dist/schemas/index.js.map +1 -0
  20. package/dist/tools/get-css.d.ts +30 -0
  21. package/dist/tools/get-css.d.ts.map +1 -0
  22. package/dist/tools/get-css.js +99 -0
  23. package/dist/tools/get-css.js.map +1 -0
  24. package/dist/tools/get-elements.d.ts +14 -0
  25. package/dist/tools/get-elements.d.ts.map +1 -0
  26. package/dist/tools/get-elements.js +56 -0
  27. package/dist/tools/get-elements.js.map +1 -0
  28. package/dist/tools/get-pwa-specs.d.ts +10 -0
  29. package/dist/tools/get-pwa-specs.d.ts.map +1 -0
  30. package/dist/tools/get-pwa-specs.js +100 -0
  31. package/dist/tools/get-pwa-specs.js.map +1 -0
  32. package/dist/tools/get-spec.d.ts +10 -0
  33. package/dist/tools/get-spec.d.ts.map +1 -0
  34. package/dist/tools/get-spec.js +58 -0
  35. package/dist/tools/get-spec.js.map +1 -0
  36. package/dist/tools/get-webidl.d.ts +9 -0
  37. package/dist/tools/get-webidl.d.ts.map +1 -0
  38. package/dist/tools/get-webidl.js +50 -0
  39. package/dist/tools/get-webidl.js.map +1 -0
  40. package/dist/tools/list-specs.d.ts +6 -0
  41. package/dist/tools/list-specs.d.ts.map +1 -0
  42. package/dist/tools/list-specs.js +38 -0
  43. package/dist/tools/list-specs.js.map +1 -0
  44. package/dist/tools/search-specs.d.ts +16 -0
  45. package/dist/tools/search-specs.d.ts.map +1 -0
  46. package/dist/tools/search-specs.js +117 -0
  47. package/dist/tools/search-specs.js.map +1 -0
  48. package/dist/types/index.d.ts +85 -0
  49. package/dist/types/index.d.ts.map +1 -0
  50. package/dist/types/index.js +5 -0
  51. package/dist/types/index.js.map +1 -0
  52. package/dist/utils/logger.d.ts +49 -0
  53. package/dist/utils/logger.d.ts.map +1 -0
  54. package/dist/utils/logger.js +113 -0
  55. package/dist/utils/logger.js.map +1 -0
  56. 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,6 @@
1
+ /**
2
+ * List W3C/WHATWG/IETF web specifications
3
+ */
4
+ import type { ListSpecsOptions, SpecSummary } from '../types/index.js';
5
+ export declare function listSpecs(options?: ListSpecsOptions): Promise<SpecSummary[]>;
6
+ //# sourceMappingURL=list-specs.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Type definitions for W3C MCP Server
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.js.map
@@ -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
+ }