@orchestra-mcp/marketplace 1.0.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 ADDED
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Orchestra MCP
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.
package/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # @orchestra-mcp/marketplace
2
+
3
+ Extension marketplace components for Orchestra MCP
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @orchestra-mcp/marketplace
9
+ ```
10
+
11
+ ## License
12
+
13
+ MIT — [Orchestra MCP](https://orchestra-mcp.dev)
package/dist/index.cjs ADDED
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ MarketplaceCard: () => MarketplaceCard
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+
27
+ // src/MarketplaceCard/MarketplaceCard.tsx
28
+ var import_jsx_runtime = require("react/jsx-runtime");
29
+ var TYPE_LABELS = {
30
+ extension: "Extension",
31
+ "ai-tool": "AI Tool",
32
+ "os-service": "OS Service"
33
+ };
34
+ function formatCount(n) {
35
+ if (n >= 1e5) return `${Math.floor(n / 1e3)}k+`;
36
+ if (n >= 1e3) return `${(n / 1e3).toFixed(1).replace(/\.0$/, "")}k`;
37
+ return String(n);
38
+ }
39
+ function StarRating({ rating }) {
40
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "mc-stars", "aria-label": `${rating} out of 5 stars`, children: Array.from({ length: 5 }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: i < Math.round(rating) ? "mc-star--filled" : "mc-star--empty", children: i < Math.round(rating) ? "\u2605" : "\u2606" }, i)) });
41
+ }
42
+ var MarketplaceCard = ({
43
+ name,
44
+ author,
45
+ description,
46
+ icon,
47
+ type,
48
+ rating,
49
+ installCount,
50
+ installed = false,
51
+ verified = false,
52
+ hasUpdate = false,
53
+ onInstall,
54
+ onUninstall,
55
+ onUpdate
56
+ }) => {
57
+ const iconNode = typeof icon === "string" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { src: icon, alt: `${name} icon`, className: "mc-icon-img" }) : icon;
58
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mc-card", "data-type": type, children: [
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mc-header", children: [
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mc-icon", children: iconNode }),
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mc-info", children: [
62
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mc-title-row", children: [
63
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "mc-name", children: name }),
64
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `mc-badge mc-badge--${type}`, children: TYPE_LABELS[type] })
65
+ ] }),
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mc-author", children: [
67
+ author,
68
+ verified && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "mc-verified", title: "Verified", "aria-label": "Verified", children: "\u2713" })
69
+ ] }),
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mc-desc", children: description })
71
+ ] })
72
+ ] }),
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mc-footer", children: [
74
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mc-stats", children: [
75
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StarRating, { rating }),
76
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "mc-installs", children: [
77
+ formatCount(installCount),
78
+ " installs"
79
+ ] })
80
+ ] }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mc-actions", children: [
82
+ hasUpdate && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "mc-btn mc-btn--update", onClick: onUpdate, children: "Update" }),
83
+ installed && !hasUpdate && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "mc-btn mc-btn--uninstall", onClick: onUninstall, children: "Uninstall" }),
84
+ !installed && !hasUpdate && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "mc-btn mc-btn--install", onClick: onInstall, children: "Install" })
85
+ ] })
86
+ ] })
87
+ ] });
88
+ };
89
+ // Annotate the CommonJS export names for ESM import in node:
90
+ 0 && (module.exports = {
91
+ MarketplaceCard
92
+ });
package/dist/index.css ADDED
@@ -0,0 +1,192 @@
1
+ /* src/MarketplaceCard/MarketplaceCard.css */
2
+ .mc-card {
3
+ border: 1px solid var(--color-border);
4
+ border-radius: 8px;
5
+ padding: 16px;
6
+ background: var(--color-bg-alt);
7
+ transition: box-shadow 0.15s ease, border-color 0.15s ease;
8
+ }
9
+ .mc-card:hover {
10
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
11
+ border-color: var(--color-accent);
12
+ }
13
+ .mc-header {
14
+ display: flex;
15
+ gap: 12px;
16
+ margin-bottom: 12px;
17
+ }
18
+ .mc-icon {
19
+ width: 48px;
20
+ height: 48px;
21
+ flex-shrink: 0;
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ border-radius: 8px;
26
+ overflow: hidden;
27
+ background: var(--color-bg-active, rgba(128, 128, 128, 0.1));
28
+ }
29
+ .mc-icon-img {
30
+ width: 100%;
31
+ height: 100%;
32
+ object-fit: cover;
33
+ }
34
+ .mc-info {
35
+ flex: 1;
36
+ min-width: 0;
37
+ }
38
+ .mc-title-row {
39
+ display: flex;
40
+ align-items: center;
41
+ justify-content: space-between;
42
+ gap: 8px;
43
+ }
44
+ .mc-name {
45
+ font-weight: 600;
46
+ font-size: 14px;
47
+ color: var(--color-fg);
48
+ white-space: nowrap;
49
+ overflow: hidden;
50
+ text-overflow: ellipsis;
51
+ }
52
+ .mc-author {
53
+ font-size: 12px;
54
+ color: var(--color-fg-muted, var(--color-fg));
55
+ opacity: 0.7;
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 4px;
59
+ }
60
+ .mc-verified {
61
+ display: inline-flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ width: 14px;
65
+ height: 14px;
66
+ border-radius: 50%;
67
+ background: var(--color-accent);
68
+ color: #fff;
69
+ font-size: 9px;
70
+ font-weight: 700;
71
+ }
72
+ .mc-desc {
73
+ margin: 4px 0 0;
74
+ font-size: 13px;
75
+ color: var(--color-fg);
76
+ opacity: 0.8;
77
+ line-height: 1.4;
78
+ display: -webkit-box;
79
+ -webkit-line-clamp: 2;
80
+ -webkit-box-orient: vertical;
81
+ overflow: hidden;
82
+ }
83
+ .mc-badge {
84
+ font-size: 11px;
85
+ font-weight: 500;
86
+ padding: 2px 8px;
87
+ border-radius: 10px;
88
+ white-space: nowrap;
89
+ flex-shrink: 0;
90
+ }
91
+ .mc-badge--extension {
92
+ background: rgba(59, 130, 246, 0.15);
93
+ color: #3b82f6;
94
+ }
95
+ .mc-badge--ai-tool {
96
+ background: rgba(139, 92, 246, 0.15);
97
+ color: #8b5cf6;
98
+ }
99
+ .mc-badge--os-service {
100
+ background: rgba(34, 197, 94, 0.15);
101
+ color: #22c55e;
102
+ }
103
+ .mc-footer {
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: space-between;
107
+ gap: 8px;
108
+ border-top: 1px solid var(--color-border);
109
+ padding-top: 10px;
110
+ }
111
+ .mc-stats {
112
+ display: flex;
113
+ align-items: center;
114
+ gap: 10px;
115
+ font-size: 12px;
116
+ color: var(--color-fg);
117
+ opacity: 0.7;
118
+ }
119
+ .mc-stars {
120
+ display: inline-flex;
121
+ gap: 1px;
122
+ font-size: 13px;
123
+ }
124
+ .mc-star--filled {
125
+ color: #f59e0b;
126
+ }
127
+ .mc-star--empty {
128
+ color: var(--color-border);
129
+ }
130
+ .mc-installs {
131
+ white-space: nowrap;
132
+ }
133
+ .mc-btn {
134
+ font-size: 12px;
135
+ font-weight: 500;
136
+ padding: 5px 14px;
137
+ border-radius: 6px;
138
+ border: none;
139
+ cursor: pointer;
140
+ transition: opacity 0.15s ease;
141
+ }
142
+ .mc-btn:hover {
143
+ opacity: 0.85;
144
+ }
145
+ .mc-btn--install {
146
+ background: var(--color-accent);
147
+ color: #fff;
148
+ }
149
+ .mc-btn--uninstall {
150
+ background: transparent;
151
+ color: #ef4444;
152
+ border: 1px solid #ef4444;
153
+ }
154
+ .mc-btn--update {
155
+ background: #f59e0b;
156
+ color: #fff;
157
+ }
158
+ [data-variant=compact] .mc-card {
159
+ padding: 10px;
160
+ border-radius: 6px;
161
+ }
162
+ [data-variant=compact] .mc-icon {
163
+ width: 36px;
164
+ height: 36px;
165
+ border-radius: 6px;
166
+ }
167
+ [data-variant=compact] .mc-name {
168
+ font-size: 13px;
169
+ }
170
+ [data-variant=compact] .mc-desc {
171
+ font-size: 12px;
172
+ }
173
+ [data-variant=compact] .mc-btn {
174
+ font-size: 11px;
175
+ padding: 4px 10px;
176
+ }
177
+ [data-variant=modern] .mc-card {
178
+ padding: 20px;
179
+ border-radius: 12px;
180
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
181
+ }
182
+ [data-variant=modern] .mc-card:hover {
183
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.14);
184
+ }
185
+ [data-variant=modern] .mc-icon {
186
+ border-radius: 10px;
187
+ }
188
+ [data-variant=modern] .mc-btn {
189
+ border-radius: 8px;
190
+ font-weight: 600;
191
+ padding: 6px 16px;
192
+ }
@@ -0,0 +1,34 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface MarketplaceCardProps {
5
+ /** Extension/tool name */
6
+ name: string;
7
+ /** Author name */
8
+ author: string;
9
+ /** Short description */
10
+ description: string;
11
+ /** Icon as ReactNode or image URL */
12
+ icon: ReactNode | string;
13
+ /** Item type */
14
+ type: 'extension' | 'ai-tool' | 'os-service';
15
+ /** Star rating 0-5 */
16
+ rating: number;
17
+ /** Total installs */
18
+ installCount: number;
19
+ /** Whether currently installed */
20
+ installed?: boolean;
21
+ /** Whether author is verified */
22
+ verified?: boolean;
23
+ /** Whether an update is available */
24
+ hasUpdate?: boolean;
25
+ /** Install callback */
26
+ onInstall?: () => void;
27
+ /** Uninstall callback */
28
+ onUninstall?: () => void;
29
+ /** Update callback */
30
+ onUpdate?: () => void;
31
+ }
32
+ declare const MarketplaceCard: ({ name, author, description, icon, type, rating, installCount, installed, verified, hasUpdate, onInstall, onUninstall, onUpdate, }: MarketplaceCardProps) => react_jsx_runtime.JSX.Element;
33
+
34
+ export { MarketplaceCard, type MarketplaceCardProps };
@@ -0,0 +1,34 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface MarketplaceCardProps {
5
+ /** Extension/tool name */
6
+ name: string;
7
+ /** Author name */
8
+ author: string;
9
+ /** Short description */
10
+ description: string;
11
+ /** Icon as ReactNode or image URL */
12
+ icon: ReactNode | string;
13
+ /** Item type */
14
+ type: 'extension' | 'ai-tool' | 'os-service';
15
+ /** Star rating 0-5 */
16
+ rating: number;
17
+ /** Total installs */
18
+ installCount: number;
19
+ /** Whether currently installed */
20
+ installed?: boolean;
21
+ /** Whether author is verified */
22
+ verified?: boolean;
23
+ /** Whether an update is available */
24
+ hasUpdate?: boolean;
25
+ /** Install callback */
26
+ onInstall?: () => void;
27
+ /** Uninstall callback */
28
+ onUninstall?: () => void;
29
+ /** Update callback */
30
+ onUpdate?: () => void;
31
+ }
32
+ declare const MarketplaceCard: ({ name, author, description, icon, type, rating, installCount, installed, verified, hasUpdate, onInstall, onUninstall, onUpdate, }: MarketplaceCardProps) => react_jsx_runtime.JSX.Element;
33
+
34
+ export { MarketplaceCard, type MarketplaceCardProps };
package/dist/index.js ADDED
@@ -0,0 +1,65 @@
1
+ // src/MarketplaceCard/MarketplaceCard.tsx
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ var TYPE_LABELS = {
4
+ extension: "Extension",
5
+ "ai-tool": "AI Tool",
6
+ "os-service": "OS Service"
7
+ };
8
+ function formatCount(n) {
9
+ if (n >= 1e5) return `${Math.floor(n / 1e3)}k+`;
10
+ if (n >= 1e3) return `${(n / 1e3).toFixed(1).replace(/\.0$/, "")}k`;
11
+ return String(n);
12
+ }
13
+ function StarRating({ rating }) {
14
+ return /* @__PURE__ */ jsx("span", { className: "mc-stars", "aria-label": `${rating} out of 5 stars`, children: Array.from({ length: 5 }, (_, i) => /* @__PURE__ */ jsx("span", { className: i < Math.round(rating) ? "mc-star--filled" : "mc-star--empty", children: i < Math.round(rating) ? "\u2605" : "\u2606" }, i)) });
15
+ }
16
+ var MarketplaceCard = ({
17
+ name,
18
+ author,
19
+ description,
20
+ icon,
21
+ type,
22
+ rating,
23
+ installCount,
24
+ installed = false,
25
+ verified = false,
26
+ hasUpdate = false,
27
+ onInstall,
28
+ onUninstall,
29
+ onUpdate
30
+ }) => {
31
+ const iconNode = typeof icon === "string" ? /* @__PURE__ */ jsx("img", { src: icon, alt: `${name} icon`, className: "mc-icon-img" }) : icon;
32
+ return /* @__PURE__ */ jsxs("div", { className: "mc-card", "data-type": type, children: [
33
+ /* @__PURE__ */ jsxs("div", { className: "mc-header", children: [
34
+ /* @__PURE__ */ jsx("div", { className: "mc-icon", children: iconNode }),
35
+ /* @__PURE__ */ jsxs("div", { className: "mc-info", children: [
36
+ /* @__PURE__ */ jsxs("div", { className: "mc-title-row", children: [
37
+ /* @__PURE__ */ jsx("span", { className: "mc-name", children: name }),
38
+ /* @__PURE__ */ jsx("span", { className: `mc-badge mc-badge--${type}`, children: TYPE_LABELS[type] })
39
+ ] }),
40
+ /* @__PURE__ */ jsxs("div", { className: "mc-author", children: [
41
+ author,
42
+ verified && /* @__PURE__ */ jsx("span", { className: "mc-verified", title: "Verified", "aria-label": "Verified", children: "\u2713" })
43
+ ] }),
44
+ /* @__PURE__ */ jsx("p", { className: "mc-desc", children: description })
45
+ ] })
46
+ ] }),
47
+ /* @__PURE__ */ jsxs("div", { className: "mc-footer", children: [
48
+ /* @__PURE__ */ jsxs("div", { className: "mc-stats", children: [
49
+ /* @__PURE__ */ jsx(StarRating, { rating }),
50
+ /* @__PURE__ */ jsxs("span", { className: "mc-installs", children: [
51
+ formatCount(installCount),
52
+ " installs"
53
+ ] })
54
+ ] }),
55
+ /* @__PURE__ */ jsxs("div", { className: "mc-actions", children: [
56
+ hasUpdate && /* @__PURE__ */ jsx("button", { type: "button", className: "mc-btn mc-btn--update", onClick: onUpdate, children: "Update" }),
57
+ installed && !hasUpdate && /* @__PURE__ */ jsx("button", { type: "button", className: "mc-btn mc-btn--uninstall", onClick: onUninstall, children: "Uninstall" }),
58
+ !installed && !hasUpdate && /* @__PURE__ */ jsx("button", { type: "button", className: "mc-btn mc-btn--install", onClick: onInstall, children: "Install" })
59
+ ] })
60
+ ] })
61
+ ] });
62
+ };
63
+ export {
64
+ MarketplaceCard
65
+ };
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@orchestra-mcp/marketplace",
3
+ "version": "1.0.0",
4
+ "description": "Extension marketplace components for Orchestra MCP",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/orchestra-mcp/marketplace"
25
+ },
26
+ "funding": "https://github.com/sponsors/fadymondy",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@orchestra-mcp/ui": "^1.0.0",
30
+ "@orchestra-mcp/icons": "^1.0.0"
31
+ },
32
+ "peerDependencies": {
33
+ "react": ">=18.0.0",
34
+ "react-dom": ">=18.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/react": "^19.0.0",
38
+ "@types/react-dom": "^19.0.0",
39
+ "tsup": "^8.3.5",
40
+ "typescript": "^5.7.2"
41
+ },
42
+ "scripts": {
43
+ "build": "tsup src/index.ts --format cjs,esm --dts --clean",
44
+ "prepublishOnly": "pnpm build"
45
+ }
46
+ }