@orchyn/mcp 1.12.2 → 1.12.3

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.
@@ -11,7 +11,7 @@ import { OrchynError } from "./orchyn.js";
11
11
  import { formatPaywallError, runVideoAnalysis, validatePostUrl } from "./video.js";
12
12
  import { ORCHYN_UI_TEMPLATE } from "./ui-template.js";
13
13
  /** Current MCP server version — bumped on every deploy for traceability. */
14
- export const MCP_SERVER_VERSION = "1.12.1";
14
+ export const MCP_SERVER_VERSION = "1.12.2";
15
15
  /** MCP Apps extension identifier */
16
16
  const UI_EXTENSION = "io.modelcontextprotocol/ui";
17
17
  /** MIME type for MCP Apps HTML resources */
@@ -36,10 +36,13 @@ export const ORCHYN_UI_TEMPLATE = `<!DOCTYPE html>
36
36
  body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--bg);color:var(--fg);padding:16px;line-height:1.5;}
37
37
 
38
38
  /* ─── Loading / Skeleton ─── */
39
- .loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;gap:16px;}
40
- .loading-spinner{width:32px;height:32px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite;}
39
+ .loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;gap:12px;}
40
+ .orchyn-logo{animation:logoSpin 3s ease-in-out infinite;}
41
+ @keyframes logoSpin{0%,100%{transform:rotate(0deg) scale(1)}50%{transform:rotate(180deg) scale(1.1)}}
42
+ .loading-brand{font-size:18px;font-weight:700;letter-spacing:-0.02em;color:var(--fg);}
43
+ .loading-spinner{width:28px;height:28px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite;}
41
44
  @keyframes spin{to{transform:rotate(360deg)}}
42
- .loading-text{font-size:14px;color:var(--muted);animation:pulse 1.5s ease-in-out infinite;}
45
+ .loading-text{font-size:13px;color:var(--muted);animation:pulse 1.5s ease-in-out infinite;}
43
46
  @keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}
44
47
 
45
48
  .skeleton{background:var(--tag);border-radius:var(--radius-sm);overflow:hidden;position:relative;}
@@ -165,14 +168,30 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
165
168
  <body>
166
169
  <div id="app">
167
170
  <div class="loading-container">
168
- <div class="loading-spinner"></div>
169
- <div class="loading-text">Loading results…</div>
171
+ <div class="orchyn-logo">
172
+ <svg width="40" height="40" viewBox="0 0 48 48" fill="none">
173
+ <g fill="var(--accent)" transform="translate(24 24)">
174
+ <circle r="4.1"/>
175
+ <g id="r"><path d="M-2.85 -5.2 L0 -20.6 L2.85 -5.2 L1.15 1.1 L-1.15 1.1 Z"/></g>
176
+ <use href="#r" transform="rotate(45)"/>
177
+ <use href="#r" transform="rotate(90)"/>
178
+ <use href="#r" transform="rotate(135)"/>
179
+ <use href="#r" transform="rotate(180)"/>
180
+ <use href="#r" transform="rotate(225)"/>
181
+ <use href="#r" transform="rotate(270)"/>
182
+ <use href="#r" transform="rotate(315)"/>
183
+ </g>
184
+ </svg>
185
+ </div>
186
+ <div class="loading-brand">Orchyn</div>
187
+ <div class="loading-text">Analyzing…</div>
170
188
  </div>
171
189
  </div>
172
190
  <script>
173
191
  (function(){
174
192
  var nextId=1;var pending=new Map();
175
193
  var loadingTimer=null;
194
+ var currentTool="";
176
195
 
177
196
  function send(method,params){
178
197
  var id=nextId++;
@@ -197,6 +216,7 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
197
216
  render(d.params);
198
217
  }
199
218
  if(d.method==="ui/notifications/tool-input-partial"){
219
+ currentTool=d.params&&d.params.name?d.params.name:"";
200
220
  updateProgress(d.params);
201
221
  }
202
222
  });
@@ -204,7 +224,7 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
204
224
  // Show skeleton after 300ms of waiting (feels instant but shows loading for slow tools)
205
225
  loadingTimer=setTimeout(function(){
206
226
  var app=document.getElementById("app");
207
- if(app)app.innerHTML=renderSkeleton();
227
+ if(app)app.innerHTML=renderSkeleton(currentTool);
208
228
  },300);
209
229
 
210
230
  // Fallback: if no tool-result arrives within 3s, check if data is embedded
@@ -228,11 +248,12 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
228
248
  if(decoded&&typeof decoded==="object"){render(decoded);return;}
229
249
  }
230
250
  }catch(e){}
231
- // Last resort: show a minimal card indicating results are available
251
+ // Last resort: show a branded card indicating results are available
232
252
  var app=document.getElementById("app");
233
- if(app)app.innerHTML='<div class="card card-wide fade-in"><div class="card-body">'
234
- +'<div style="font-size:14px;font-weight:600;margin-bottom:8px">✅ Results ready</div>'
235
- +'<div style="font-size:13px;color:var(--muted)">Tool execution complete. See the full response in the chat.</div>'
253
+ if(app)app.innerHTML='<div class="card card-wide fade-in"><div class="card-body" style="text-align:center;padding:24px">'
254
+ +'<svg width="28" height="28" viewBox="0 0 48 48" fill="none" style="margin-bottom:8px"><g fill="var(--accent)" transform="translate(24 24)"><circle r="4.1"/><g id="rf"><path d="M-2.85 -5.2 L0 -20.6 L2.85 -5.2 L1.15 1.1 L-1.15 1.1 Z"/></g><use href="#rf" transform="rotate(45)"/><use href="#rf" transform="rotate(90)"/><use href="#rf" transform="rotate(135)"/><use href="#rf" transform="rotate(180)"/><use href="#rf" transform="rotate(225)"/><use href="#rf" transform="rotate(270)"/><use href="#rf" transform="rotate(315)"/></g></svg>'
255
+ +'<div style="font-size:14px;font-weight:600;margin-bottom:4px">✅ Results ready</div>'
256
+ +'<div style="font-size:12px;color:var(--muted)">Orchyn analysis complete — see the full response in the chat.</div>'
236
257
  +'</div></div>';
237
258
  },3000);
238
259
 
@@ -256,9 +277,46 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
256
277
  }
257
278
 
258
279
  // ─── Skeleton ───
259
- function renderSkeleton(){
260
- return '<div class="skeleton-gallery stagger">'
261
- +Array(3).fill(0).map(function(){
280
+ // Tools that analyze/fetch a single URL: show 1 wide card skeleton
281
+ var SINGLE_URL_TOOLS={analyze_post:1,get_social_media:1,understand_social_post:1,get_post_comments:1,analyze_creator_profile:1};
282
+ // Tools that return galleries: show multiple small card skeletons
283
+ var GALLERY_TOOLS={discover_social_posts:1,get_user_posts:1,search_creators:1,get_similar_creators:1,discover_sounds:1};
284
+ // Tools that return credits/checkout: show 1 credit card skeleton
285
+ var CREDIT_TOOLS={check_orchyn_credits:1,buy_orchyn_credits:1};
286
+
287
+ function renderSkeleton(toolName){
288
+ // Branded header above skeletons
289
+ var brandHeader='<div style="display:flex;align-items:center;gap:8px;margin-bottom:14px;justify-content:center">'
290
+ +'<svg width="20" height="20" viewBox="0 0 48 48" fill="none"><g fill="var(--accent)" transform="translate(24 24)"><circle r="4.1"/><g id="sb"><path d="M-2.85 -5.2 L0 -20.6 L2.85 -5.2 L1.15 1.1 L-1.15 1.1 Z"/></g><use href="#sb" transform="rotate(45)"/><use href="#sb" transform="rotate(90)"/><use href="#sb" transform="rotate(135)"/><use href="#sb" transform="rotate(180)"/><use href="#sb" transform="rotate(225)"/><use href="#sb" transform="rotate(270)"/><use href="#sb" transform="rotate(315)"/></g></svg>'
291
+ +'<span style="font-size:13px;font-weight:600;color:var(--muted)">Orchyn</span></div>';
292
+ // Single URL tools → 1 wide card skeleton
293
+ if(SINGLE_URL_TOOLS[toolName]){
294
+ return brandHeader+'<div class="fade-in" style="max-width:520px">'
295
+ +'<div class="skeleton-card" style="width:100%">'
296
+ +'<div class="skeleton skeleton-thumb" style="height:220px"></div>'
297
+ +'<div style="padding:14px 16px">'
298
+ +'<div class="skeleton skeleton-badge"></div>'
299
+ +'<div class="skeleton skeleton-line" style="width:90%"></div>'
300
+ +'<div class="skeleton skeleton-line medium"></div>'
301
+ +'<div style="display:flex;gap:6px;margin-top:10px">'
302
+ +'<div class="skeleton" style="width:70px;height:28px;border-radius:999px"></div>'
303
+ +'<div class="skeleton" style="width:60px;height:28px;border-radius:999px"></div>'
304
+ +'<div class="skeleton" style="width:65px;height:28px;border-radius:999px"></div>'
305
+ +'</div></div></div></div>';
306
+ }
307
+ // Credit tools → credit card skeleton
308
+ if(CREDIT_TOOLS[toolName]){
309
+ return brandHeader+'<div class="fade-in" style="max-width:380px">'
310
+ +'<div class="credits-card" style="margin:0">'
311
+ +'<div class="skeleton" style="width:120px;height:20px;margin-bottom:14px"></div>'
312
+ +'<div class="skeleton" style="width:80px;height:40px;margin-bottom:8px"></div>'
313
+ +'<div class="skeleton" style="width:140px;height:14px"></div>'
314
+ +'</div></div>';
315
+ }
316
+ // Gallery tools → multiple small card skeletons (default)
317
+ var count=toolName==='discover_sounds'?4:toolName==='search_creators'||toolName==='get_similar_creators'?3:6;
318
+ return brandHeader+'<div class="skeleton-gallery stagger">'
319
+ +Array(count).fill(0).map(function(){
262
320
  return '<div class="skeleton-card">'
263
321
  +'<div class="skeleton skeleton-thumb"></div>'
264
322
  +'<div class="skeleton skeleton-badge"></div>'
@@ -436,9 +494,21 @@ body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--
436
494
  function updateProgress(params){
437
495
  var app=document.getElementById("app");
438
496
  if(!app)return;
497
+ // If we just learned the tool name and the current skeleton is wrong,
498
+ // re-render with the correct skeleton type
499
+ var toolName=params&&params.name?params.name:currentTool;
500
+ if(toolName&&toolName!==currentTool){
501
+ currentTool=toolName;
502
+ // Only re-render skeleton if we're still in loading state (no result yet)
503
+ var el=document.getElementById("app");
504
+ if(el&&(el.querySelector(".loading-spinner")||el.querySelector(".skeleton"))){
505
+ el.innerHTML=renderSkeleton(currentTool);
506
+ }
507
+ }
439
508
  var text=params&&params.arguments?JSON.stringify(params.arguments):"Processing…";
440
509
  app.innerHTML='<div class="loading-container fade-in">'
441
- +'<div class="loading-spinner"></div>'
510
+ +'<div class="orchyn-logo"><svg width="36" height="36" viewBox="0 0 48 48" fill="none"><g fill="var(--accent)" transform="translate(24 24)"><circle r="4.1"/><g id="rp"><path d="M-2.85 -5.2 L0 -20.6 L2.85 -5.2 L1.15 1.1 L-1.15 1.1 Z"/></g><use href="#rp" transform="rotate(45)"/><use href="#rp" transform="rotate(90)"/><use href="#rp" transform="rotate(135)"/><use href="#rp" transform="rotate(180)"/><use href="#rp" transform="rotate(225)"/><use href="#rp" transform="rotate(270)"/><use href="#rp" transform="rotate(315)"/></g></svg></div>'
511
+ +'<div class="loading-brand">Orchyn</div>'
442
512
  +'<div class="loading-text">'+esc(text.length>80?text.slice(0,80)+"…":text)+'</div>'
443
513
  +'<div class="progress-bar" style="width:200px"><div class="progress-fill" style="width:60%"></div></div>'
444
514
  +'</div>';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orchyn/mcp",
3
- "version": "1.12.2",
3
+ "version": "1.12.3",
4
4
  "description": "MCP server for orchyn - fetch, discover and understand TikTok/Instagram/YouTube/X posts with AI (media metadata, niche discovery, hook & viral analysis)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",