@contractspec/app.alpic-mcp 1.59.0 → 1.61.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 CHANGED
@@ -1,5 +1,29 @@
1
1
  # @contractspec/app.alpic-mcp
2
2
 
3
+ ## 1.61.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 374fd71: fix: publishing
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [374fd71]
12
+ - @contractspec/bundle.alpic@1.61.0
13
+ - @contractspec/lib.logger@1.61.0
14
+
15
+ ## 1.60.0
16
+
17
+ ### Minor Changes
18
+
19
+ - fix: publish with bun
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies
24
+ - @contractspec/bundle.alpic@1.60.0
25
+ - @contractspec/lib.logger@1.60.0
26
+
3
27
  ## 1.59.0
4
28
 
5
29
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/app.alpic-mcp",
3
- "version": "1.59.0",
3
+ "version": "1.61.0",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
@@ -14,12 +14,12 @@
14
14
  "start": "node dist/server.js"
15
15
  },
16
16
  "dependencies": {
17
- "@contractspec/bundle.alpic": "1.59.0",
18
- "@contractspec/lib.logger": "1.59.0"
17
+ "@contractspec/bundle.alpic": "1.61.0",
18
+ "@contractspec/lib.logger": "1.61.0"
19
19
  },
20
20
  "devDependencies": {
21
- "@contractspec/tool.tsdown": "1.59.0",
22
- "@contractspec/tool.typescript": "1.59.0",
21
+ "@contractspec/tool.tsdown": "1.61.0",
22
+ "@contractspec/tool.typescript": "1.61.0",
23
23
  "@types/node": "^25.2.1",
24
24
  "tsdown": "^0.20.3",
25
25
  "typescript": "^5.9.3"
@@ -1,40 +0,0 @@
1
- const origin = window.location.origin;
2
-
3
- const config = {
4
- mcpServers: {
5
- 'alpic-app': {
6
- url: origin,
7
- transport: 'http',
8
- },
9
- },
10
- };
11
-
12
- const originTargets = document.querySelectorAll('[data-origin]');
13
- originTargets.forEach((node) => {
14
- node.textContent = origin;
15
- });
16
-
17
- const configNode = document.getElementById('config-json');
18
- if (configNode) {
19
- configNode.textContent = JSON.stringify(config, null, 2);
20
- }
21
-
22
- const copyButton = document.getElementById('copy-config');
23
- if (copyButton) {
24
- copyButton.addEventListener('click', async () => {
25
- try {
26
- await navigator.clipboard.writeText(JSON.stringify(config, null, 2));
27
- copyButton.textContent = 'Copied';
28
- copyButton.classList.add('is-copied');
29
- setTimeout(() => {
30
- copyButton.textContent = 'Copy MCP config';
31
- copyButton.classList.remove('is-copied');
32
- }, 1600);
33
- } catch {
34
- copyButton.textContent = 'Copy failed';
35
- setTimeout(() => {
36
- copyButton.textContent = 'Copy MCP config';
37
- }, 1600);
38
- }
39
- });
40
- }
@@ -1,102 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>ContractSpec Alpic MCP</title>
7
- <link rel="preconnect" href="https://fonts.googleapis.com" />
8
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
- <link
10
- href="https://fonts.googleapis.com/css2?family=Newsreader:opsz,wght@6..72,400;6..72,600&family=Space+Grotesk:wght@400;500;600;700&display=swap"
11
- rel="stylesheet"
12
- />
13
- <link rel="stylesheet" href="/assets/style.css" />
14
- </head>
15
- <body>
16
- <main class="page">
17
- <header class="hero">
18
- <span class="hero__badge">Alpic MCP + ChatGPT App</span>
19
- <h1>Ship MCP tools with a polished UI on Alpic.</h1>
20
- <p>
21
- This starter ships a minimal MCP surface and a static UI bundle.
22
- Deploy it on Alpic and you get MCP endpoints at <span>/</span> and
23
- <span>/mcp</span>, plus static assets served from
24
- <span>/assets</span>.
25
- </p>
26
- <div class="hero__actions">
27
- <button class="primary" id="copy-config">Copy MCP config</button>
28
- <a class="ghost" href="#assets">See assets</a>
29
- </div>
30
- <div class="hero__meta">
31
- <div class="meta-card">
32
- <span>Base URL</span>
33
- <code data-origin>https://your-app.alpic.live</code>
34
- </div>
35
- <div class="meta-card">
36
- <span>Assets</span>
37
- <code>/assets</code>
38
- </div>
39
- </div>
40
- </header>
41
-
42
- <section class="grid">
43
- <article class="card">
44
- <h2>MCP endpoints</h2>
45
- <ul>
46
- <li><strong>/</strong> - SSE + Streamable HTTP</li>
47
- <li><strong>/mcp</strong> - Streamable HTTP</li>
48
- </ul>
49
- </article>
50
- <article class="card">
51
- <h2>UI resource</h2>
52
- <p>
53
- The MCP resource <strong>app://ui</strong> points to the UI entry at
54
- <strong>/assets/index.html</strong>.
55
- </p>
56
- </article>
57
- <article class="card">
58
- <h2>Copy-ready config</h2>
59
- <pre id="config-json" class="code"></pre>
60
- </article>
61
- </section>
62
-
63
- <section id="assets" class="assets">
64
- <div class="assets__header">
65
- <h2>Assets bundle</h2>
66
- <p>Drop any static files in <code>assets/</code> before deploying.</p>
67
- </div>
68
- <div class="assets__list">
69
- <div class="asset-item">
70
- <span>index.html</span>
71
- <small>UI shell</small>
72
- </div>
73
- <div class="asset-item">
74
- <span>style.css</span>
75
- <small>Design system</small>
76
- </div>
77
- <div class="asset-item">
78
- <span>app.js</span>
79
- <small>Client boot</small>
80
- </div>
81
- </div>
82
- </section>
83
-
84
- <footer class="footer">
85
- <div><strong>ContractSpec</strong> + Alpic MCP starter</div>
86
- <div class="footer__links">
87
- <a href="https://docs.alpic.ai" target="_blank" rel="noreferrer">
88
- Alpic docs
89
- </a>
90
- <a
91
- href="https://docs.alpic.ai/guides/hosting-chatgpt-app-assets"
92
- target="_blank"
93
- rel="noreferrer"
94
- >
95
- Hosting assets
96
- </a>
97
- </div>
98
- </footer>
99
- </main>
100
- <script type="module" src="/assets/app.js"></script>
101
- </body>
102
- </html>
@@ -1,315 +0,0 @@
1
- :root {
2
- --bg: #f7f2ea;
3
- --bg-alt: #e9f3f1;
4
- --ink: #1f1b16;
5
- --muted: #6b6258;
6
- --card: #ffffff;
7
- --accent: #1b7f6b;
8
- --accent-strong: #156554;
9
- --accent-warm: #d97941;
10
- --border: rgba(31, 27, 22, 0.12);
11
- --shadow: 0 18px 40px rgba(31, 27, 22, 0.12);
12
- --radius: 24px;
13
- --radius-small: 14px;
14
- --space: 24px;
15
- --mono: 'Space Grotesk', 'Avenir Next', sans-serif;
16
- --serif: 'Newsreader', 'Georgia', serif;
17
- }
18
-
19
- * {
20
- box-sizing: border-box;
21
- }
22
-
23
- body {
24
- margin: 0;
25
- font-family: var(--mono);
26
- color: var(--ink);
27
- background:
28
- radial-gradient(circle at top left, #fff4e6, transparent 55%),
29
- linear-gradient(135deg, var(--bg), var(--bg-alt));
30
- min-height: 100vh;
31
- display: flex;
32
- justify-content: center;
33
- }
34
-
35
- body::before,
36
- body::after {
37
- content: '';
38
- position: fixed;
39
- z-index: -1;
40
- width: 340px;
41
- height: 340px;
42
- border-radius: 50%;
43
- filter: blur(10px);
44
- opacity: 0.35;
45
- }
46
-
47
- body::before {
48
- top: -120px;
49
- right: -80px;
50
- background: radial-gradient(circle, #b6e2d3, transparent 70%);
51
- }
52
-
53
- body::after {
54
- bottom: -140px;
55
- left: -120px;
56
- background: radial-gradient(circle, #f2c4a0, transparent 70%);
57
- }
58
-
59
- .page {
60
- width: min(1100px, 92vw);
61
- padding: 48px 0 64px;
62
- display: flex;
63
- flex-direction: column;
64
- gap: 48px;
65
- animation: fade-in 0.6s ease-out;
66
- }
67
-
68
- @keyframes fade-in {
69
- from {
70
- opacity: 0;
71
- transform: translateY(14px);
72
- }
73
- to {
74
- opacity: 1;
75
- transform: translateY(0);
76
- }
77
- }
78
-
79
- .hero {
80
- background: var(--card);
81
- padding: clamp(28px, 4vw, 48px);
82
- border-radius: var(--radius);
83
- box-shadow: var(--shadow);
84
- border: 1px solid var(--border);
85
- display: flex;
86
- flex-direction: column;
87
- gap: 16px;
88
- }
89
-
90
- .hero__badge {
91
- align-self: flex-start;
92
- padding: 8px 14px;
93
- border-radius: 999px;
94
- background: rgba(27, 127, 107, 0.12);
95
- color: var(--accent-strong);
96
- font-weight: 600;
97
- letter-spacing: 0.03em;
98
- text-transform: uppercase;
99
- font-size: 12px;
100
- }
101
-
102
- .hero h1 {
103
- font-size: clamp(32px, 4vw, 48px);
104
- margin: 0;
105
- line-height: 1.05;
106
- }
107
-
108
- .hero p {
109
- margin: 0;
110
- font-size: 17px;
111
- color: var(--muted);
112
- font-family: var(--serif);
113
- }
114
-
115
- .hero p span {
116
- font-weight: 600;
117
- color: var(--ink);
118
- }
119
-
120
- .hero__actions {
121
- display: flex;
122
- flex-wrap: wrap;
123
- gap: 14px;
124
- }
125
-
126
- .hero__actions .primary,
127
- .hero__actions .ghost {
128
- border-radius: 999px;
129
- padding: 12px 20px;
130
- font-size: 15px;
131
- border: none;
132
- cursor: pointer;
133
- text-decoration: none;
134
- transition:
135
- transform 0.2s ease,
136
- box-shadow 0.2s ease;
137
- }
138
-
139
- .hero__actions .primary {
140
- background: var(--accent);
141
- color: #fff;
142
- box-shadow: 0 14px 24px rgba(27, 127, 107, 0.25);
143
- }
144
-
145
- .hero__actions .primary:hover {
146
- transform: translateY(-1px);
147
- box-shadow: 0 18px 28px rgba(27, 127, 107, 0.3);
148
- }
149
-
150
- .hero__actions .primary.is-copied {
151
- background: var(--accent-strong);
152
- }
153
-
154
- .hero__actions .ghost {
155
- border: 1px solid var(--border);
156
- color: var(--ink);
157
- background: transparent;
158
- }
159
-
160
- .hero__meta {
161
- display: grid;
162
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
163
- gap: 12px;
164
- margin-top: 10px;
165
- }
166
-
167
- .meta-card {
168
- border-radius: var(--radius-small);
169
- padding: 14px 16px;
170
- background: rgba(27, 127, 107, 0.08);
171
- display: grid;
172
- gap: 6px;
173
- }
174
-
175
- .meta-card span {
176
- font-size: 12px;
177
- text-transform: uppercase;
178
- letter-spacing: 0.04em;
179
- color: var(--muted);
180
- }
181
-
182
- .meta-card code {
183
- font-family: var(--mono);
184
- font-weight: 600;
185
- }
186
-
187
- .grid {
188
- display: grid;
189
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
190
- gap: 18px;
191
- }
192
-
193
- .card {
194
- background: var(--card);
195
- border: 1px solid var(--border);
196
- border-radius: var(--radius-small);
197
- padding: 20px;
198
- display: flex;
199
- flex-direction: column;
200
- gap: 12px;
201
- box-shadow: 0 14px 26px rgba(31, 27, 22, 0.08);
202
- }
203
-
204
- .card h2 {
205
- margin: 0;
206
- font-size: 20px;
207
- }
208
-
209
- .card p {
210
- margin: 0;
211
- color: var(--muted);
212
- font-family: var(--serif);
213
- }
214
-
215
- .card ul {
216
- margin: 0;
217
- padding-left: 18px;
218
- color: var(--muted);
219
- }
220
-
221
- .card strong {
222
- color: var(--ink);
223
- }
224
-
225
- .code {
226
- background: #0f172a;
227
- color: #dbeafe;
228
- padding: 16px;
229
- border-radius: 12px;
230
- font-size: 12px;
231
- line-height: 1.5;
232
- overflow-x: auto;
233
- }
234
-
235
- .assets {
236
- background: var(--card);
237
- padding: 24px;
238
- border-radius: var(--radius);
239
- border: 1px solid var(--border);
240
- display: grid;
241
- gap: 20px;
242
- }
243
-
244
- .assets__header h2 {
245
- margin: 0 0 6px;
246
- }
247
-
248
- .assets__header p {
249
- margin: 0;
250
- color: var(--muted);
251
- font-family: var(--serif);
252
- }
253
-
254
- .assets__list {
255
- display: grid;
256
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
257
- gap: 14px;
258
- }
259
-
260
- .asset-item {
261
- padding: 16px;
262
- border-radius: 14px;
263
- border: 1px solid var(--border);
264
- background: rgba(217, 121, 65, 0.08);
265
- display: grid;
266
- gap: 6px;
267
- }
268
-
269
- .asset-item span {
270
- font-weight: 600;
271
- }
272
-
273
- .asset-item small {
274
- color: var(--muted);
275
- }
276
-
277
- .footer {
278
- display: flex;
279
- flex-wrap: wrap;
280
- justify-content: space-between;
281
- gap: 12px;
282
- color: var(--muted);
283
- font-size: 14px;
284
- }
285
-
286
- .footer__links {
287
- display: flex;
288
- gap: 16px;
289
- }
290
-
291
- .footer a {
292
- color: var(--accent-strong);
293
- text-decoration: none;
294
- }
295
-
296
- .footer a:hover {
297
- text-decoration: underline;
298
- }
299
-
300
- @media (max-width: 720px) {
301
- .page {
302
- padding-top: 32px;
303
- }
304
-
305
- .hero__actions {
306
- flex-direction: column;
307
- align-items: stretch;
308
- }
309
-
310
- .hero__actions .primary,
311
- .hero__actions .ghost {
312
- width: 100%;
313
- text-align: center;
314
- }
315
- }
package/dist/index.d.mts DELETED
@@ -1 +0,0 @@
1
- export { };
package/dist/index.mjs DELETED
@@ -1,3 +0,0 @@
1
- import "./server.mjs";
2
-
3
- export { };
package/dist/server.d.mts DELETED
@@ -1,35 +0,0 @@
1
- import * as elysia from "elysia";
2
-
3
- //#region src/server.d.ts
4
- declare const app: elysia.default<"", {
5
- decorator: {};
6
- store: {};
7
- derive: {};
8
- resolve: {};
9
- }, {
10
- typebox: {};
11
- error: {};
12
- }, {
13
- schema: {};
14
- standaloneSchema: {};
15
- macro: {};
16
- macroFn: {};
17
- parser: {};
18
- response: {};
19
- }, {}, {
20
- derive: {};
21
- resolve: {};
22
- schema: {};
23
- standaloneSchema: {};
24
- response: {};
25
- }, {
26
- derive: {};
27
- resolve: {};
28
- schema: {};
29
- standaloneSchema: {};
30
- response: {};
31
- }>;
32
- type App = typeof app;
33
- //#endregion
34
- export { App, app };
35
- //# sourceMappingURL=server.d.mts.map
package/dist/server.mjs DELETED
@@ -1,42 +0,0 @@
1
- import { createAlpicMcpApp } from "@contractspec/bundle.alpic";
2
- import { LogLevel, Logger } from "@contractspec/lib.logger";
3
-
4
- //#region src/server.ts
5
- const PORT = Number(process.env.PORT ?? 8080);
6
- const logger = new Logger({
7
- level: process.env.NODE_ENV === "production" ? LogLevel.INFO : LogLevel.DEBUG,
8
- environment: process.env.NODE_ENV || "development",
9
- enableTracing: false,
10
- enableTiming: false,
11
- enableContext: false,
12
- enableColors: process.env.NODE_ENV !== "production"
13
- });
14
- const app = createAlpicMcpApp({
15
- logger,
16
- serverName: process.env.ALPIC_MCP_NAME ?? "contractspec-alpic-mcp",
17
- serverVersion: process.env.ALPIC_MCP_VERSION ?? "1.0.0"
18
- });
19
- app.listen(PORT);
20
- logger.info("alpic-mcp.started", {
21
- port: PORT,
22
- endpoints: {
23
- root: "/",
24
- mcp: "/mcp",
25
- assets: "/assets"
26
- }
27
- });
28
- const shutdown = async (signal) => {
29
- logger.info("alpic-mcp.shutdown", { signal });
30
- await logger.flush();
31
- process.exit(0);
32
- };
33
- process.on("SIGTERM", () => {
34
- shutdown("SIGTERM");
35
- });
36
- process.on("SIGINT", () => {
37
- shutdown("SIGINT");
38
- });
39
-
40
- //#endregion
41
- export { app };
42
- //# sourceMappingURL=server.mjs.map