@atlaskit/ads-mcp 0.18.1 → 0.19.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/CHANGELOG.md +9 -0
- package/README.md +2 -2
- package/dist/cjs/helpers/fuse-multi-term.js +130 -0
- package/dist/cjs/helpers/index.js +15 -1
- package/dist/cjs/index.js +28 -14
- package/dist/cjs/instructions.js +1 -1
- package/dist/cjs/tools/analyze-a11y/index.js +12 -12
- package/dist/cjs/tools/get-a11y-guidelines/index.js +3 -3
- package/dist/cjs/tools/{get-components → get-all-components}/index.js +6 -6
- package/dist/cjs/tools/get-all-icons/index.js +1 -1
- package/dist/cjs/tools/get-all-tokens/index.js +1 -1
- package/dist/cjs/tools/get-guidelines/index.js +4 -4
- package/dist/cjs/tools/get-lint-rules/index.js +5 -5
- package/dist/cjs/tools/i18n-conversion/index.js +3 -3
- package/dist/cjs/tools/migration-guides/index.js +3 -3
- package/dist/cjs/tools/plan/index.js +13 -17
- package/dist/cjs/tools/search-components/index.js +44 -65
- package/dist/cjs/tools/search-icons/index.js +42 -68
- package/dist/cjs/tools/search-tokens/index.js +56 -43
- package/dist/cjs/tools/suggest-a11y-fixes/index.js +7 -7
- package/dist/es2019/helpers/fuse-multi-term.js +98 -0
- package/dist/es2019/helpers/index.js +1 -0
- package/dist/es2019/index.js +81 -83
- package/dist/es2019/instructions.js +2 -1
- package/dist/es2019/tools/analyze-a11y/index.js +28 -12
- package/dist/es2019/tools/get-a11y-guidelines/index.js +10 -3
- package/dist/es2019/tools/{get-components → get-all-components}/index.js +9 -4
- package/dist/es2019/tools/get-all-icons/index.js +6 -1
- package/dist/es2019/tools/get-all-tokens/index.js +6 -1
- package/dist/es2019/tools/get-guidelines/index.js +20 -7
- package/dist/es2019/tools/get-lint-rules/index.js +12 -8
- package/dist/es2019/tools/i18n-conversion/index.js +10 -13
- package/dist/es2019/tools/migration-guides/index.js +10 -4
- package/dist/es2019/tools/plan/index.js +25 -25
- package/dist/es2019/tools/search-components/index.js +42 -56
- package/dist/es2019/tools/search-icons/index.js +37 -62
- package/dist/es2019/tools/search-tokens/index.js +54 -45
- package/dist/es2019/tools/suggest-a11y-fixes/index.js +16 -7
- package/dist/esm/helpers/fuse-multi-term.js +122 -0
- package/dist/esm/helpers/index.js +1 -0
- package/dist/esm/index.js +28 -14
- package/dist/esm/instructions.js +1 -1
- package/dist/esm/tools/analyze-a11y/index.js +12 -12
- package/dist/esm/tools/get-a11y-guidelines/index.js +3 -3
- package/dist/esm/tools/{get-components → get-all-components}/index.js +5 -5
- package/dist/esm/tools/get-all-icons/index.js +1 -1
- package/dist/esm/tools/get-all-tokens/index.js +1 -1
- package/dist/esm/tools/get-guidelines/index.js +4 -4
- package/dist/esm/tools/get-lint-rules/index.js +5 -5
- package/dist/esm/tools/i18n-conversion/index.js +3 -3
- package/dist/esm/tools/migration-guides/index.js +3 -3
- package/dist/esm/tools/plan/index.js +13 -17
- package/dist/esm/tools/search-components/index.js +45 -66
- package/dist/esm/tools/search-icons/index.js +43 -69
- package/dist/esm/tools/search-tokens/index.js +57 -44
- package/dist/esm/tools/suggest-a11y-fixes/index.js +7 -7
- package/dist/types/helpers/fuse-multi-term.d.ts +45 -0
- package/dist/types/helpers/index.d.ts +1 -0
- package/dist/types/instructions.d.ts +1 -1
- package/dist/types/tools/{get-components → get-all-components}/index.d.ts +2 -2
- package/dist/types/tools/plan/index.d.ts +1 -4
- package/dist/types/tools/search-components/index.d.ts +1 -4
- package/dist/types/tools/search-icons/index.d.ts +1 -4
- package/dist/types/tools/search-tokens/index.d.ts +1 -4
- package/dist/types-ts4.5/helpers/fuse-multi-term.d.ts +45 -0
- package/dist/types-ts4.5/helpers/index.d.ts +1 -0
- package/dist/types-ts4.5/instructions.d.ts +1 -1
- package/dist/types-ts4.5/tools/{get-components → get-all-components}/index.d.ts +2 -2
- package/dist/types-ts4.5/tools/plan/index.d.ts +1 -4
- package/dist/types-ts4.5/tools/search-components/index.d.ts +1 -4
- package/dist/types-ts4.5/tools/search-icons/index.d.ts +1 -4
- package/dist/types-ts4.5/tools/search-tokens/index.d.ts +1 -4
- package/package.json +5 -5
- /package/dist/cjs/tools/{get-components → get-all-components}/components.codegen.js +0 -0
- /package/dist/cjs/tools/{get-components → get-all-components}/components.js +0 -0
- /package/dist/cjs/tools/{get-components → get-all-components}/load-all-components.js +0 -0
- /package/dist/cjs/tools/{get-components → get-all-components}/types.js +0 -0
- /package/dist/es2019/tools/{get-components → get-all-components}/components.codegen.js +0 -0
- /package/dist/es2019/tools/{get-components → get-all-components}/components.js +0 -0
- /package/dist/es2019/tools/{get-components → get-all-components}/load-all-components.js +0 -0
- /package/dist/es2019/tools/{get-components → get-all-components}/types.js +0 -0
- /package/dist/esm/tools/{get-components → get-all-components}/components.codegen.js +0 -0
- /package/dist/esm/tools/{get-components → get-all-components}/components.js +0 -0
- /package/dist/esm/tools/{get-components → get-all-components}/load-all-components.js +0 -0
- /package/dist/esm/tools/{get-components → get-all-components}/types.js +0 -0
- /package/dist/types/tools/{get-components → get-all-components}/components.codegen.d.ts +0 -0
- /package/dist/types/tools/{get-components → get-all-components}/components.d.ts +0 -0
- /package/dist/types/tools/{get-components → get-all-components}/load-all-components.d.ts +0 -0
- /package/dist/types/tools/{get-components → get-all-components}/types.d.ts +0 -0
- /package/dist/types-ts4.5/tools/{get-components → get-all-components}/components.codegen.d.ts +0 -0
- /package/dist/types-ts4.5/tools/{get-components → get-all-components}/components.d.ts +0 -0
- /package/dist/types-ts4.5/tools/{get-components → get-all-components}/load-all-components.d.ts +0 -0
- /package/dist/types-ts4.5/tools/{get-components → get-all-components}/types.d.ts +0 -0
|
@@ -16,17 +16,16 @@ var _searchTokens = require("../search-tokens");
|
|
|
16
16
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
17
17
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* eslint-disable-next-line import/extensions -- MCP SDK requires .js extensions for ESM imports */
|
|
18
18
|
var planInputSchema = exports.planInputSchema = _zod.z.object({
|
|
19
|
-
tokens: _zod.z.array(_zod.z.string()).describe('
|
|
20
|
-
icons: _zod.z.array(_zod.z.string()).describe('
|
|
21
|
-
components: _zod.z.array(_zod.z.string()).describe('
|
|
22
|
-
limit: _zod.z.number().default(
|
|
23
|
-
exactName: _zod.z.boolean().default(false).describe('Search tokens, icons, and components by their exact name match (use when you explicitly know the name and need more details)').optional()
|
|
19
|
+
tokens: _zod.z.array(_zod.z.string()).describe('Search terms for ADS design tokens (fuzzy by default). Use `[]` if you only need icons or components. Prefer **at least two** terms per non-empty list when you know what you need.'),
|
|
20
|
+
icons: _zod.z.array(_zod.z.string()).describe('Search terms for ADS icons. Use `[]` if you only need tokens or components. Prefer **at least two** terms per non-empty list when known.'),
|
|
21
|
+
components: _zod.z.array(_zod.z.string()).describe('Search terms for ADS components. Use `[]` if you only need tokens or icons. Prefer **at least two** terms per non-empty list when known.'),
|
|
22
|
+
limit: _zod.z.number().default(2).describe('Max matches **per term** for each non-empty list (default 2). Same limit applies to tokens, icons, and components searches.').optional()
|
|
24
23
|
});
|
|
25
24
|
var listPlanTool = exports.listPlanTool = {
|
|
26
25
|
name: 'ads_plan',
|
|
27
|
-
description: "
|
|
26
|
+
description: "Runs **ads_search_tokens**, **ads_search_icons**, and **ads_search_components** in one call and returns a single JSON payload (each section only if that list was non-empty). Use this as the default way to discover ADS **tokens**, **icons**, and **components** for a UI task.\n\nWHEN TO USE:\n**Implementing or iterating on a UI**\u2014new screen, feature, or polish\u2014and you need candidate **token** names, **icon** imports, and **component** packages/props in one pass. Also use when exploring ADS building blocks before you write code.\n\nAt least one of `tokens`, `icons`, or `components` must contain search terms (use `[]` for lists you do not need).\n\nPrefer supplying **multiple** terms per non-empty array when you know them\u2014broader queries improve recall. Some queries return no rows where metadata is thin; try alternate wording.\n\nThis is equivalent to calling the individual search tools; there are no extra merge semantics beyond concatenating results.\n\nExample request:\n```json\n{\n\t\"tokens\": [\"spacing\", \"inverted text\", \"background primary\", \"animation\"],\n\t\"icons\": [\"search\", \"folder\", \"user\"],\n\t\"components\": [\"button\", \"input\", \"select\", \"heading\"]\n}\n```\n\nExample token usage:\n```tsx\nimport { token } from '@atlaskit/tokens';\nconst styles = css({ color: token('color.text'), padding: token('space.100') });\n```\n\nExample icon usage:\n```tsx\nimport AddIcon from '@atlaskit/icon/core/add';\n<AddIcon label=\"Add work item\" size=\"small\" />\n```",
|
|
28
27
|
annotations: {
|
|
29
|
-
title: '
|
|
28
|
+
title: 'Search ADS tokens, icons, and components to plan what to build',
|
|
30
29
|
readOnlyHint: true,
|
|
31
30
|
destructiveHint: false,
|
|
32
31
|
idempotentHint: true,
|
|
@@ -35,12 +34,12 @@ var listPlanTool = exports.listPlanTool = {
|
|
|
35
34
|
inputSchema: (0, _helpers.zodToJsonSchema)(planInputSchema)
|
|
36
35
|
};
|
|
37
36
|
var planTool = exports.planTool = /*#__PURE__*/function () {
|
|
38
|
-
var
|
|
39
|
-
var tokens_search, icons_search, components_search,
|
|
37
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
|
|
38
|
+
var tokens_search, icons_search, components_search, limit, results, searchPromises, getResultCount, consolidatedResult;
|
|
40
39
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
41
40
|
while (1) switch (_context.prev = _context.next) {
|
|
42
41
|
case 0:
|
|
43
|
-
tokens_search =
|
|
42
|
+
tokens_search = _ref.tokens, icons_search = _ref.icons, components_search = _ref.components, limit = _ref.limit;
|
|
44
43
|
if (!(!(tokens_search !== null && tokens_search !== void 0 && tokens_search.length) && !(icons_search !== null && icons_search !== void 0 && icons_search.length) && !(components_search !== null && components_search !== void 0 && components_search.length))) {
|
|
45
44
|
_context.next = 3;
|
|
46
45
|
break;
|
|
@@ -58,8 +57,7 @@ var planTool = exports.planTool = /*#__PURE__*/function () {
|
|
|
58
57
|
if (tokens_search !== null && tokens_search !== void 0 && tokens_search.length) {
|
|
59
58
|
searchPromises.push((0, _searchTokens.searchTokensTool)({
|
|
60
59
|
terms: tokens_search,
|
|
61
|
-
limit: limit
|
|
62
|
-
exactName: exactName
|
|
60
|
+
limit: limit
|
|
63
61
|
}).then(function (result) {
|
|
64
62
|
results.tokens = result;
|
|
65
63
|
}));
|
|
@@ -67,8 +65,7 @@ var planTool = exports.planTool = /*#__PURE__*/function () {
|
|
|
67
65
|
if (icons_search !== null && icons_search !== void 0 && icons_search.length) {
|
|
68
66
|
searchPromises.push((0, _searchIcons.searchIconsTool)({
|
|
69
67
|
terms: icons_search,
|
|
70
|
-
limit: limit
|
|
71
|
-
exactName: exactName
|
|
68
|
+
limit: limit
|
|
72
69
|
}).then(function (result) {
|
|
73
70
|
results.icons = result;
|
|
74
71
|
}));
|
|
@@ -76,8 +73,7 @@ var planTool = exports.planTool = /*#__PURE__*/function () {
|
|
|
76
73
|
if (components_search !== null && components_search !== void 0 && components_search.length) {
|
|
77
74
|
searchPromises.push((0, _searchComponents.searchComponentsTool)({
|
|
78
75
|
terms: components_search,
|
|
79
|
-
limit: limit
|
|
80
|
-
exactName: exactName
|
|
76
|
+
limit: limit
|
|
81
77
|
}).then(function (result) {
|
|
82
78
|
results.components = result;
|
|
83
79
|
}));
|
|
@@ -131,6 +127,6 @@ var planTool = exports.planTool = /*#__PURE__*/function () {
|
|
|
131
127
|
}, _callee);
|
|
132
128
|
}));
|
|
133
129
|
return function planTool(_x) {
|
|
134
|
-
return
|
|
130
|
+
return _ref2.apply(this, arguments);
|
|
135
131
|
};
|
|
136
132
|
}();
|
|
@@ -6,21 +6,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.searchComponentsTool = exports.searchComponentsInputSchema = exports.listSearchComponentsTool = void 0;
|
|
8
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
10
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
11
|
var _fuse = _interopRequireDefault(require("fuse.js"));
|
|
11
12
|
var _zod = require("zod");
|
|
12
13
|
var _helpers = require("../../helpers");
|
|
13
|
-
var _loadAllComponents = require("../get-components/load-all-components");
|
|
14
|
+
var _loadAllComponents = require("../get-all-components/load-all-components");
|
|
14
15
|
/* eslint-disable-next-line import/extensions -- MCP SDK requires .js extensions for ESM imports */
|
|
15
16
|
|
|
16
17
|
var searchComponentsInputSchema = exports.searchComponentsInputSchema = _zod.z.object({
|
|
17
|
-
terms: _zod.z.array(_zod.z.string()).describe('
|
|
18
|
-
limit: _zod.z.number().default(
|
|
19
|
-
exactName: _zod.z.boolean().default(false).describe('Enable to explicitly search components by the exact name match (when you know the name, but need more details)').optional()
|
|
18
|
+
terms: _zod.z.array(_zod.z.string()).describe('Required: one or more search terms (fuzzy over name, package, category, description, keywords, examples). Example: `["button", "modal", "select"]`.'),
|
|
19
|
+
limit: _zod.z.number().default(2).describe('Max matches **per term** (default 2).').optional()
|
|
20
20
|
});
|
|
21
21
|
var listSearchComponentsTool = exports.listSearchComponentsTool = {
|
|
22
22
|
name: 'ads_search_components',
|
|
23
|
-
description:
|
|
23
|
+
description: "Searches the bundled Atlassian Design System (ADS) component catalog. Returns JSON objects with **name**, **package**, **examples**, and **props** for each match (trimmed payload).\n\nWHEN TO USE:\n**Selecting which ADS component to use**\u2014package name, examples, and props\u2014before implementation. Use when composing a new view or swapping a primitive. Prefer `ads_plan` when you also need token and icon discovery in one shot.",
|
|
24
24
|
annotations: {
|
|
25
25
|
title: 'Search ADS components',
|
|
26
26
|
readOnlyHint: true,
|
|
@@ -30,9 +30,7 @@ var listSearchComponentsTool = exports.listSearchComponentsTool = {
|
|
|
30
30
|
},
|
|
31
31
|
inputSchema: (0, _helpers.zodToJsonSchema)(searchComponentsInputSchema)
|
|
32
32
|
};
|
|
33
|
-
|
|
34
|
-
// Clean component result to only return name, package name, example, and props
|
|
35
|
-
var cleanComponentResult = function cleanComponentResult(result) {
|
|
33
|
+
var buildComponentResult = function buildComponentResult(result) {
|
|
36
34
|
return {
|
|
37
35
|
name: result.name,
|
|
38
36
|
package: result.package,
|
|
@@ -41,52 +39,29 @@ var cleanComponentResult = function cleanComponentResult(result) {
|
|
|
41
39
|
};
|
|
42
40
|
};
|
|
43
41
|
var searchComponentsTool = exports.searchComponentsTool = /*#__PURE__*/function () {
|
|
44
|
-
var
|
|
45
|
-
var terms,
|
|
42
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
|
|
43
|
+
var terms, _ref$limit, limit, searchTerms, components, fuse, matchedItems;
|
|
46
44
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
47
45
|
while (1) switch (_context.prev = _context.next) {
|
|
48
46
|
case 0:
|
|
49
|
-
terms =
|
|
50
|
-
searchTerms = terms.filter(Boolean).map(_helpers.cleanQuery);
|
|
47
|
+
terms = _ref.terms, _ref$limit = _ref.limit, limit = _ref$limit === void 0 ? 2 : _ref$limit;
|
|
48
|
+
searchTerms = (0, _toConsumableArray2.default)(new Set(terms.filter(Boolean).map(_helpers.cleanQuery)));
|
|
51
49
|
if (searchTerms.length) {
|
|
52
50
|
_context.next = 4;
|
|
53
51
|
break;
|
|
54
52
|
}
|
|
55
53
|
return _context.abrupt("return", {
|
|
56
|
-
isError: true,
|
|
57
54
|
content: [{
|
|
58
55
|
type: 'text',
|
|
59
|
-
text:
|
|
56
|
+
text: '[]'
|
|
60
57
|
}]
|
|
61
58
|
});
|
|
62
59
|
case 4:
|
|
63
60
|
components = (0, _loadAllComponents.loadAllComponents)();
|
|
64
|
-
if (!exactName) {
|
|
65
|
-
_context.next = 9;
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
// for each search term, search for the exact match
|
|
69
|
-
exactNameMatches = searchTerms.map(function (term) {
|
|
70
|
-
return components.find(function (component) {
|
|
71
|
-
return component.name.toLowerCase() === term.toLowerCase();
|
|
72
|
-
});
|
|
73
|
-
}).filter(Boolean);
|
|
74
|
-
if (!(exactNameMatches.length > 0)) {
|
|
75
|
-
_context.next = 9;
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
return _context.abrupt("return", {
|
|
79
|
-
content: [{
|
|
80
|
-
type: 'text',
|
|
81
|
-
text: JSON.stringify(exactNameMatches.map(cleanComponentResult))
|
|
82
|
-
}]
|
|
83
|
-
});
|
|
84
|
-
case 9:
|
|
85
|
-
// use Fuse.js to fuzzy-search through the components
|
|
86
61
|
fuse = new _fuse.default(components, {
|
|
87
62
|
keys: [{
|
|
88
63
|
name: 'name',
|
|
89
|
-
weight:
|
|
64
|
+
weight: 5
|
|
90
65
|
}, {
|
|
91
66
|
name: 'package',
|
|
92
67
|
weight: 3
|
|
@@ -96,30 +71,42 @@ var searchComponentsTool = exports.searchComponentsTool = /*#__PURE__*/function
|
|
|
96
71
|
}, {
|
|
97
72
|
name: 'description',
|
|
98
73
|
weight: 2
|
|
74
|
+
}, {
|
|
75
|
+
name: 'keywords',
|
|
76
|
+
weight: 2
|
|
77
|
+
}, {
|
|
78
|
+
name: 'usageGuidelines',
|
|
79
|
+
weight: 2
|
|
80
|
+
}, {
|
|
81
|
+
name: 'contentGuidelines',
|
|
82
|
+
weight: 1
|
|
83
|
+
}, {
|
|
84
|
+
name: 'accessibilityGuidelines',
|
|
85
|
+
weight: 1
|
|
99
86
|
}, {
|
|
100
87
|
name: 'examples',
|
|
101
88
|
weight: 1
|
|
102
89
|
}],
|
|
103
|
-
threshold: 0.4
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
90
|
+
threshold: 0.4,
|
|
91
|
+
distance: 80,
|
|
92
|
+
minMatchCharLength: 3,
|
|
93
|
+
ignoreFieldNorm: true,
|
|
94
|
+
includeScore: true
|
|
95
|
+
});
|
|
96
|
+
matchedItems = (0, _helpers.mergeMultiTermFuseResults)({
|
|
97
|
+
searchTerms: searchTerms,
|
|
98
|
+
limit: limit,
|
|
99
|
+
search: function search(query) {
|
|
100
|
+
return fuse.search(query, {
|
|
101
|
+
limit: limit * searchTerms.length
|
|
102
|
+
});
|
|
114
103
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
_context.next = 13;
|
|
104
|
+
});
|
|
105
|
+
if (matchedItems.length) {
|
|
106
|
+
_context.next = 9;
|
|
119
107
|
break;
|
|
120
108
|
}
|
|
121
109
|
return _context.abrupt("return", {
|
|
122
|
-
isError: true,
|
|
123
110
|
content: [{
|
|
124
111
|
type: 'text',
|
|
125
112
|
text: "Error: No components found for '".concat(terms.join(', '), "'. Available components: ").concat(components.map(function (c) {
|
|
@@ -127,28 +114,20 @@ var searchComponentsTool = exports.searchComponentsTool = /*#__PURE__*/function
|
|
|
127
114
|
}).join(', '))
|
|
128
115
|
}]
|
|
129
116
|
});
|
|
130
|
-
case
|
|
131
|
-
// Remove duplicates based on component name
|
|
132
|
-
uniqueResults = results.filter(function (result, index, arr) {
|
|
133
|
-
return arr.findIndex(function (r) {
|
|
134
|
-
return r.item.name === result.item.name;
|
|
135
|
-
}) === index;
|
|
136
|
-
});
|
|
117
|
+
case 9:
|
|
137
118
|
return _context.abrupt("return", {
|
|
138
119
|
content: [{
|
|
139
120
|
type: 'text',
|
|
140
|
-
text: JSON.stringify(
|
|
141
|
-
return result.item;
|
|
142
|
-
}).map(cleanComponentResult))
|
|
121
|
+
text: JSON.stringify(matchedItems.map(buildComponentResult))
|
|
143
122
|
}]
|
|
144
123
|
});
|
|
145
|
-
case
|
|
124
|
+
case 10:
|
|
146
125
|
case "end":
|
|
147
126
|
return _context.stop();
|
|
148
127
|
}
|
|
149
128
|
}, _callee);
|
|
150
129
|
}));
|
|
151
130
|
return function searchComponentsTool(_x) {
|
|
152
|
-
return
|
|
131
|
+
return _ref2.apply(this, arguments);
|
|
153
132
|
};
|
|
154
133
|
}();
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.searchIconsTool = exports.searchIconsInputSchema = exports.listSearchIconsTool = void 0;
|
|
8
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
10
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
11
|
var _fuse = _interopRequireDefault(require("fuse.js"));
|
|
11
12
|
var _zod = require("zod");
|
|
@@ -14,13 +15,19 @@ var _icons = require("../get-all-icons/icons");
|
|
|
14
15
|
/* eslint-disable-next-line import/extensions -- MCP SDK requires .js extensions for ESM imports */
|
|
15
16
|
|
|
16
17
|
var searchIconsInputSchema = exports.searchIconsInputSchema = _zod.z.object({
|
|
17
|
-
terms: _zod.z.array(_zod.z.string()).describe('
|
|
18
|
-
limit: _zod.z.number().default(
|
|
19
|
-
exactName: _zod.z.boolean().default(false).describe('Enable to explicitly search icons by the exact name match (when you know the name, but need more details)').optional()
|
|
18
|
+
terms: _zod.z.array(_zod.z.string()).describe('Required: one or more terms; fuzzy match on icon **componentName**, **iconName**, **keywords**, **categorization**, **type**, and **usage**. Example: `["search", "folder", "user"]`.'),
|
|
19
|
+
limit: _zod.z.number().default(2).describe('Max matches **per term** (default 2).').optional()
|
|
20
20
|
});
|
|
21
|
+
var buildIconResult = function buildIconResult(icon) {
|
|
22
|
+
return {
|
|
23
|
+
componentName: icon.componentName,
|
|
24
|
+
package: icon.package,
|
|
25
|
+
usage: icon.usage
|
|
26
|
+
};
|
|
27
|
+
};
|
|
21
28
|
var listSearchIconsTool = exports.listSearchIconsTool = {
|
|
22
29
|
name: 'ads_search_icons',
|
|
23
|
-
description: "
|
|
30
|
+
description: "Searches the bundled Atlassian Design System **icon** catalog. Returns JSON with **componentName**, **package**, and **usage** for each match.\n\nWHEN TO USE:\n**Choosing an icon** for a control, nav item, empty state, or illustration\u2014find `@atlaskit/icon` import paths and usage notes. Prefer `ads_plan` when you also need tokens and components together.\n\nExample:\n```tsx\nimport AddIcon from '@atlaskit/icon/core/add';\n<AddIcon label=\"Add work item\" size=\"small\" />\n```",
|
|
24
31
|
annotations: {
|
|
25
32
|
title: 'Search ADS icons',
|
|
26
33
|
readOnlyHint: true,
|
|
@@ -31,51 +38,28 @@ var listSearchIconsTool = exports.listSearchIconsTool = {
|
|
|
31
38
|
inputSchema: (0, _helpers.zodToJsonSchema)(searchIconsInputSchema)
|
|
32
39
|
};
|
|
33
40
|
var searchIconsTool = exports.searchIconsTool = /*#__PURE__*/function () {
|
|
34
|
-
var
|
|
35
|
-
var terms,
|
|
41
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
|
|
42
|
+
var terms, _ref$limit, limit, searchTerms, fuse, matchedItems;
|
|
36
43
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
37
44
|
while (1) switch (_context.prev = _context.next) {
|
|
38
45
|
case 0:
|
|
39
|
-
terms =
|
|
40
|
-
searchTerms = terms.filter(Boolean).map(_helpers.cleanQuery);
|
|
46
|
+
terms = _ref.terms, _ref$limit = _ref.limit, limit = _ref$limit === void 0 ? 2 : _ref$limit;
|
|
47
|
+
searchTerms = (0, _toConsumableArray2.default)(new Set(terms.filter(Boolean).map(_helpers.cleanQuery)));
|
|
41
48
|
if (searchTerms.length) {
|
|
42
49
|
_context.next = 4;
|
|
43
50
|
break;
|
|
44
51
|
}
|
|
45
52
|
return _context.abrupt("return", {
|
|
46
|
-
isError: true,
|
|
47
53
|
content: [{
|
|
48
54
|
type: 'text',
|
|
49
|
-
text:
|
|
55
|
+
text: '[]'
|
|
50
56
|
}]
|
|
51
57
|
});
|
|
52
58
|
case 4:
|
|
53
|
-
if (!exactName) {
|
|
54
|
-
_context.next = 8;
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
|
-
// for each search term, search for the exact match
|
|
58
|
-
exactNameMatches = searchTerms.map(function (term) {
|
|
59
|
-
return _icons.icons.find(function (icon) {
|
|
60
|
-
return icon.componentName.toLowerCase() === term.toLowerCase();
|
|
61
|
-
});
|
|
62
|
-
}).filter(Boolean);
|
|
63
|
-
if (!(exactNameMatches.length > 0)) {
|
|
64
|
-
_context.next = 8;
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
return _context.abrupt("return", {
|
|
68
|
-
content: [{
|
|
69
|
-
type: 'text',
|
|
70
|
-
text: JSON.stringify(exactNameMatches)
|
|
71
|
-
}]
|
|
72
|
-
});
|
|
73
|
-
case 8:
|
|
74
|
-
// use Fuse.js to fuzzy-search through the icons
|
|
75
59
|
fuse = new _fuse.default(_icons.icons, {
|
|
76
60
|
keys: [{
|
|
77
61
|
name: 'componentName',
|
|
78
|
-
weight:
|
|
62
|
+
weight: 5
|
|
79
63
|
}, {
|
|
80
64
|
name: 'iconName',
|
|
81
65
|
weight: 3
|
|
@@ -84,34 +68,37 @@ var searchIconsTool = exports.searchIconsTool = /*#__PURE__*/function () {
|
|
|
84
68
|
weight: 2
|
|
85
69
|
}, {
|
|
86
70
|
name: 'categorization',
|
|
87
|
-
weight:
|
|
71
|
+
weight: 2
|
|
88
72
|
}, {
|
|
89
73
|
name: 'type',
|
|
90
74
|
weight: 1
|
|
91
75
|
}, {
|
|
92
76
|
name: 'usage',
|
|
93
|
-
weight:
|
|
77
|
+
weight: 2
|
|
94
78
|
}],
|
|
95
|
-
threshold: 0.4
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
79
|
+
threshold: 0.4,
|
|
80
|
+
distance: 80,
|
|
81
|
+
minMatchCharLength: 3,
|
|
82
|
+
ignoreFieldNorm: true,
|
|
83
|
+
includeScore: true
|
|
84
|
+
});
|
|
85
|
+
matchedItems = (0, _helpers.mergeMultiTermFuseResults)({
|
|
86
|
+
searchTerms: searchTerms,
|
|
87
|
+
limit: limit,
|
|
88
|
+
search: function search(query) {
|
|
89
|
+
return fuse.search(query, {
|
|
90
|
+
limit: limit * searchTerms.length
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
tokenKey: function tokenKey(icon) {
|
|
94
|
+
return icon.componentName;
|
|
106
95
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
_context.next = 12;
|
|
96
|
+
});
|
|
97
|
+
if (matchedItems.length) {
|
|
98
|
+
_context.next = 8;
|
|
111
99
|
break;
|
|
112
100
|
}
|
|
113
101
|
return _context.abrupt("return", {
|
|
114
|
-
isError: true,
|
|
115
102
|
content: [{
|
|
116
103
|
type: 'text',
|
|
117
104
|
text: "Error: No icons found for '".concat(terms.join(', '), "'. Available icons: ").concat(_icons.icons.map(function (i) {
|
|
@@ -119,33 +106,20 @@ var searchIconsTool = exports.searchIconsTool = /*#__PURE__*/function () {
|
|
|
119
106
|
}).join(', '))
|
|
120
107
|
}]
|
|
121
108
|
});
|
|
122
|
-
case
|
|
123
|
-
// Remove duplicates based on componentName
|
|
124
|
-
uniqueResults = results.filter(function (result, index, arr) {
|
|
125
|
-
return arr.findIndex(function (r) {
|
|
126
|
-
return r.item.componentName === result.item.componentName;
|
|
127
|
-
}) === index;
|
|
128
|
-
});
|
|
129
|
-
matchedIcons = uniqueResults.map(function (result) {
|
|
130
|
-
return {
|
|
131
|
-
componentName: result.item.componentName,
|
|
132
|
-
package: result.item.package,
|
|
133
|
-
usage: result.item.usage
|
|
134
|
-
};
|
|
135
|
-
});
|
|
109
|
+
case 8:
|
|
136
110
|
return _context.abrupt("return", {
|
|
137
111
|
content: [{
|
|
138
112
|
type: 'text',
|
|
139
|
-
text: JSON.stringify(
|
|
113
|
+
text: JSON.stringify(matchedItems.map(buildIconResult))
|
|
140
114
|
}]
|
|
141
115
|
});
|
|
142
|
-
case
|
|
116
|
+
case 9:
|
|
143
117
|
case "end":
|
|
144
118
|
return _context.stop();
|
|
145
119
|
}
|
|
146
120
|
}, _callee);
|
|
147
121
|
}));
|
|
148
122
|
return function searchIconsTool(_x) {
|
|
149
|
-
return
|
|
123
|
+
return _ref2.apply(this, arguments);
|
|
150
124
|
};
|
|
151
125
|
}();
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.searchTokensTool = exports.searchTokensInputSchema = exports.listSearchTokensTool = void 0;
|
|
8
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
10
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
11
|
var _fuse = _interopRequireDefault(require("fuse.js"));
|
|
11
12
|
var _zod = require("zod");
|
|
@@ -14,13 +15,12 @@ var _helpers = require("../../helpers");
|
|
|
14
15
|
/* eslint-disable-next-line import/extensions -- MCP SDK requires .js extensions for ESM imports */
|
|
15
16
|
|
|
16
17
|
var searchTokensInputSchema = exports.searchTokensInputSchema = _zod.z.object({
|
|
17
|
-
terms: _zod.z.array(_zod.z.string()).describe('
|
|
18
|
-
limit: _zod.z.number().default(
|
|
19
|
-
exactName: _zod.z.boolean().default(false).describe('Enable to explicitly search tokens by the exact name match (when you know the name, but need more details)').optional()
|
|
18
|
+
terms: _zod.z.array(_zod.z.string()).describe('Required: one or more terms; fuzzy match on token **name**, **description**, **exampleValue**, **usageGuidelines.usage**, and **usageGuidelines.cssProperties**. Example: `["spacing", "color.text", "background"]`.'),
|
|
19
|
+
limit: _zod.z.number().default(2).describe('Max matches **per term** (default 2).').optional()
|
|
20
20
|
});
|
|
21
21
|
var listSearchTokensTool = exports.listSearchTokensTool = {
|
|
22
22
|
name: 'ads_search_tokens',
|
|
23
|
-
description: "
|
|
23
|
+
description: "Searches Atlassian Design System **design tokens** from bundled metadata. Returns JSON objects with **name** and **exampleValue** for each match (search also considers description, usage guidelines, and CSS property hints in metadata).\n\nWHEN TO USE:\n**Styling or theming in code**\u2014you need the right `token('\u2026')` names for colors, space, typography, etc. Use during layout and visual work when tokens must match ADS. Prefer `ads_plan` when you also need icons and components in the same step.\n\nExample:\n```tsx\nimport { token } from '@atlaskit/tokens';\nconst styles = css({ color: token('color.text'), padding: token('space.100') });\n```",
|
|
24
24
|
annotations: {
|
|
25
25
|
title: 'Search ADS tokens',
|
|
26
26
|
readOnlyHint: true,
|
|
@@ -31,80 +31,93 @@ var listSearchTokensTool = exports.listSearchTokensTool = {
|
|
|
31
31
|
inputSchema: (0, _helpers.zodToJsonSchema)(searchTokensInputSchema)
|
|
32
32
|
};
|
|
33
33
|
var searchTokensTool = exports.searchTokensTool = /*#__PURE__*/function () {
|
|
34
|
-
var
|
|
35
|
-
var terms,
|
|
34
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
|
|
35
|
+
var terms, _ref$limit, limit, searchTerms, fuse, matchedItems, matchedTokens;
|
|
36
36
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
37
37
|
while (1) switch (_context.prev = _context.next) {
|
|
38
38
|
case 0:
|
|
39
|
-
terms =
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
// for each search term, search for the exact match
|
|
46
|
-
exactNameMatches = searchTerms.map(function (term) {
|
|
47
|
-
return _tokenMetadata.tokens.find(function (token) {
|
|
48
|
-
return token.name.toLowerCase() === term.toLowerCase();
|
|
49
|
-
});
|
|
50
|
-
}).filter(Boolean);
|
|
51
|
-
if (!(exactNameMatches.length > 0)) {
|
|
52
|
-
_context.next = 6;
|
|
39
|
+
terms = _ref.terms, _ref$limit = _ref.limit, limit = _ref$limit === void 0 ? 2 : _ref$limit;
|
|
40
|
+
// Unique cleaned terms (order preserved) so duplicates don't concatenate into a bogus query.
|
|
41
|
+
searchTerms = (0, _toConsumableArray2.default)(new Set(terms.filter(Boolean).map(_helpers.cleanQuery)));
|
|
42
|
+
if (searchTerms.length) {
|
|
43
|
+
_context.next = 4;
|
|
53
44
|
break;
|
|
54
45
|
}
|
|
55
46
|
return _context.abrupt("return", {
|
|
56
47
|
content: [{
|
|
57
48
|
type: 'text',
|
|
58
|
-
text:
|
|
59
|
-
return {
|
|
60
|
-
name: token.name,
|
|
61
|
-
exampleValue: token.exampleValue
|
|
62
|
-
};
|
|
63
|
-
}))
|
|
49
|
+
text: '[]'
|
|
64
50
|
}]
|
|
65
51
|
});
|
|
66
|
-
case
|
|
67
|
-
// use Fuse.js to fuzzy-search for the tokens
|
|
52
|
+
case 4:
|
|
68
53
|
fuse = new _fuse.default(_tokenMetadata.tokens, {
|
|
69
54
|
keys: [{
|
|
70
55
|
name: 'name',
|
|
71
|
-
weight:
|
|
56
|
+
weight: 5
|
|
57
|
+
}, {
|
|
58
|
+
name: 'path',
|
|
59
|
+
weight: 2
|
|
72
60
|
}, {
|
|
73
61
|
name: 'description',
|
|
74
62
|
weight: 2
|
|
63
|
+
}, {
|
|
64
|
+
name: 'usageGuidelines.usage',
|
|
65
|
+
weight: 2
|
|
66
|
+
}, {
|
|
67
|
+
name: 'usageGuidelines.cssProperties',
|
|
68
|
+
weight: 3
|
|
75
69
|
}, {
|
|
76
70
|
name: 'exampleValue',
|
|
77
|
-
weight:
|
|
71
|
+
weight: 0.5
|
|
78
72
|
}],
|
|
79
|
-
threshold: 0.4
|
|
73
|
+
threshold: 0.4,
|
|
74
|
+
distance: 80,
|
|
75
|
+
minMatchCharLength: 3,
|
|
76
|
+
ignoreFieldNorm: true,
|
|
77
|
+
includeScore: true
|
|
80
78
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
79
|
+
matchedItems = (0, _helpers.mergeMultiTermFuseResults)({
|
|
80
|
+
searchTerms: searchTerms,
|
|
81
|
+
limit: limit,
|
|
82
|
+
search: function search(query) {
|
|
83
|
+
return fuse.search(query, {
|
|
84
|
+
limit: limit * searchTerms.length
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
searchTermsJoin: '.'
|
|
88
88
|
});
|
|
89
|
-
matchedTokens =
|
|
89
|
+
matchedTokens = matchedItems.map(function (item) {
|
|
90
90
|
return {
|
|
91
|
-
name:
|
|
92
|
-
exampleValue:
|
|
91
|
+
name: item.name,
|
|
92
|
+
exampleValue: item.exampleValue
|
|
93
93
|
};
|
|
94
94
|
});
|
|
95
|
+
if (matchedTokens.length) {
|
|
96
|
+
_context.next = 9;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
return _context.abrupt("return", {
|
|
100
|
+
content: [{
|
|
101
|
+
type: 'text',
|
|
102
|
+
text: "Error: No tokens found for '".concat(terms.join(', '), "'. Available tokens: ").concat(_tokenMetadata.tokens.map(function (t) {
|
|
103
|
+
return t.name;
|
|
104
|
+
}).join(', '))
|
|
105
|
+
}]
|
|
106
|
+
});
|
|
107
|
+
case 9:
|
|
95
108
|
return _context.abrupt("return", {
|
|
96
109
|
content: [{
|
|
97
110
|
type: 'text',
|
|
98
111
|
text: JSON.stringify(matchedTokens)
|
|
99
112
|
}]
|
|
100
113
|
});
|
|
101
|
-
case
|
|
114
|
+
case 10:
|
|
102
115
|
case "end":
|
|
103
116
|
return _context.stop();
|
|
104
117
|
}
|
|
105
118
|
}, _callee);
|
|
106
119
|
}));
|
|
107
120
|
return function searchTokensTool(_x) {
|
|
108
|
-
return
|
|
121
|
+
return _ref2.apply(this, arguments);
|
|
109
122
|
};
|
|
110
123
|
}();
|