@nooticr/mcp 1.26.54 → 1.26.56

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.
@@ -49,7 +49,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
49
49
  list_watchlist:"Watchlist",
50
50
  detect_spoken_mentions:"Spoken Mentions",
51
51
  nooticr_getting_started:"Getting Started",
52
- get_google_analytics:"Google Analytics",
52
+ get_google_analytics_data:"Google Analytics",
53
53
  get_search_console_data:"Search Console",
54
54
  get_posthog_analytics:"PostHog",
55
55
  compose_sequence:"Compose Sequence",
@@ -89,7 +89,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
89
89
  list_watchlist:"The creators you are watching, and when you last caught up on each.",
90
90
  detect_spoken_mentions:"Brands named out loud in a video, beside what its caption says.",
91
91
  nooticr_getting_started:"Where your account stands and what to try first.",
92
- get_google_analytics:"Your GA4 sync, as of its last sync.",
92
+ get_google_analytics_data:"Your GA4 sync, as of its last sync.",
93
93
  get_search_console_data:"Search clicks, impressions and top queries, as of the last sync.",
94
94
  get_posthog_analytics:"Your PostHog pageview trend, as of the last sync.",
95
95
  compose_sequence:"AI-powered content composition for social posts.",
@@ -1120,11 +1120,11 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
1120
1120
  // These are the fetch prices, which is all any of these tools cost now. The
1121
1121
  // two that fan out to a second call are the two that are dearer than their
1122
1122
  // headline fetch: analyze_post and understand_social_post pay 2 for the
1123
- // frames and 1 more for the transcript. score_draft fetches nothing, so it
1123
+ // frames and 1 more for the transcript. evaluate_social_draft fetches nothing, so it
1124
1124
  // has no badge — the || 0 below already hides it.
1125
- var AI_PRICE={analyze_post_fast:2,write_hooks:2,create_variants:2,
1126
- repurpose_post:2,niche_report:2,find_hook_pattern:2,analyze_post:3,
1127
- analyze_comments:2,compare_posts:1,understand_social_post:3,analyze_creator_profile:2};
1125
+ var AI_PRICE={analyze_post_fast:2,generate_hook_ideas:2,generate_post_variants:2,
1126
+ adapt_post_for_platform:2,niche_report:2,find_hook_pattern:2,analyze_post:3,
1127
+ summarize_post_comments:2,compare_social_posts:1,understand_social_post:3,analyze_creator_profile:2};
1128
1128
 
1129
1129
  // ChatGPT's Apps SDK does not answer the MCP Apps postMessage bridge. A
1130
1130
  // widget there reaches its server through window.openai.callTool, and opens
@@ -1237,10 +1237,10 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
1237
1237
  if(!url)return "";
1238
1238
  var a=JSON.stringify({url:url});
1239
1239
  return '<div class="nt-feeds-ai is-under ai-actions"><div class="nt-feeds-ai-row">'
1240
- +aiBtn("create_variants","Create variants",a)
1241
- +aiBtn("write_hooks","Write hooks",a)
1242
- +aiBtn("repurpose_post","Repurpose",a)
1243
- +aiBtn("analyze_comments","Read comments",a)
1240
+ +aiBtn("generate_post_variants","Create variants",a)
1241
+ +aiBtn("generate_hook_ideas","Write hooks",a)
1242
+ +aiBtn("adapt_post_for_platform","Repurpose",a)
1243
+ +aiBtn("summarize_post_comments","Read comments",a)
1244
1244
  +"</div></div>";
1245
1245
  }
1246
1246
 
@@ -1327,7 +1327,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
1327
1327
  +btn("default","sm",
1328
1328
  (mentions?ic("sparkles",14):ic("scales",14))
1329
1329
  +'<span class="nt-lbl">'+(mentions?"Analyse these":"Compare")+"</span>"
1330
- +(mentions?"":badge("secondary",AI_PRICE.compare_posts+" cr","nt-feeds-cr")),
1330
+ +(mentions?"":badge("secondary",AI_PRICE.compare_social_posts+" cr","nt-feeds-cr")),
1331
1331
  ' id="pickgo"'+(mentions?"":" disabled"),"primary")
1332
1332
  +"</div>";
1333
1333
  }
@@ -1403,7 +1403,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
1403
1403
  return out;
1404
1404
  }
1405
1405
 
1406
- /** Ask the host to run compare_posts; fall back to copying the URLs.
1406
+ /** Ask the host to run compare_social_posts; fall back to copying the URLs.
1407
1407
  * The method is "tools/call" - MCP Apps reuses the core MCP method for
1408
1408
  * tool invocation rather than defining a prefixed one of its own. This
1409
1409
  * used to send a ui-prefixed name that no host answers, so every in-view
@@ -1436,7 +1436,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
1436
1436
  .catch(function(){done("Copy failed");});
1437
1437
  } else done("Copy failed");
1438
1438
  };
1439
- invokeTool("compare_posts",{urls:urls},function(r){
1439
+ invokeTool("compare_social_posts",{urls:urls},function(r){
1440
1440
  settled=true;
1441
1441
  done("Sent");
1442
1442
  renderToolResult(r);
@@ -2792,7 +2792,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
2792
2792
  pickedMentions.forEach(function(id){if(id.indexOf("spoken:")===0)spoken++;});
2793
2793
  var typed=pickedMentions.length-spoken;
2794
2794
  // Which posts the picks came from is the thing that decides whether
2795
- // "Analyse these" can run (analyze_comments reads one post), so the
2795
+ // "Analyse these" can run (summarize_post_comments reads one post), so the
2796
2796
  // hint says it before the button has to refuse.
2797
2797
  var posts={};
2798
2798
  (monitorState?monitorState.threads:[]).forEach(function(t){
@@ -2813,14 +2813,14 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
2813
2813
  setTimeout(reportSize,60);
2814
2814
  }
2815
2815
 
2816
- // Selected comments go to the host as a tool call. analyze_comments's own
2816
+ // Selected comments go to the host as a tool call. summarize_post_comments's own
2817
2817
  // inputSchema is {url, limit?}.strict() — one post, not an arbitrary
2818
2818
  // hand-picked set of texts/ids — so this used to post {comments, ids}
2819
2819
  // regardless of how many posts the selection spanned, and a real host
2820
2820
  // executing that call got a schema rejection every time; the "Try in
2821
2821
  // chat"/timeout fallback was the only thing anyone ever saw work. Now:
2822
2822
  // find which post(s) the picks belong to, and if they are all the same
2823
- // one, ask analyze_comments to re-read that post's comments (the nearest
2823
+ // one, ask summarize_post_comments to re-read that post's comments (the nearest
2824
2824
  // thing to "analyse these" the tool can actually do); otherwise say why
2825
2825
  // not, rather than sending a call the schema will refuse.
2826
2826
  document.addEventListener("click",function(e){
@@ -2837,7 +2837,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
2837
2837
  });
2838
2838
  });
2839
2839
  // A spoken pick is a line from a transcript, not a comment with an id
2840
- // analyze_comments could re-read. Re-reading its post's comments would
2840
+ // summarize_post_comments could re-read. Re-reading its post's comments would
2841
2841
  // answer a different question from the one that was asked, so say so
2842
2842
  // rather than quietly analysing something else.
2843
2843
  var spokenPicks=0;
@@ -2857,7 +2857,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
2857
2857
  // The answer is drawn here, as Read comments draws it: a host that runs
2858
2858
  // a view's call hands the result back to the view and nowhere else, so a
2859
2859
  // "Sent" that dropped it left a paid read with nothing on screen.
2860
- invokeTool("analyze_comments",{url:distinct[0],limit:Math.max(pickedMentions.length,20)},function(r){
2860
+ invokeTool("summarize_post_comments",{url:distinct[0],limit:Math.max(pickedMentions.length,20)},function(r){
2861
2861
  if(renderToolResult(r))return;
2862
2862
  setGoLabel(go,"Sent");
2863
2863
  setTimeout(function(){go.disabled=false;setGoLabel(go,"Analyse these");},1800);
@@ -2937,7 +2937,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
2937
2937
  var mpId=0;
2938
2938
 
2939
2939
  /**
2940
- * compare_posts: the posts as numbered rows, the one that won marked, and
2940
+ * compare_social_posts: the posts as numbered rows, the one that won marked, and
2941
2941
  * the model's reasons under them. Every row keeps its own way back to the
2942
2942
  * post, because a comparison you cannot check is an assertion.
2943
2943
  */
@@ -3452,7 +3452,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
3452
3452
  body:stats+(steps?'<div class="nt-commerce-block-title nt-commerce-pad sec-label">Try next</div><div class="nt-rows">'+steps+"</div>":"")});
3453
3453
  }
3454
3454
 
3455
- // ─── Connector reads (get_google_analytics, get_search_console_data,
3455
+ // ─── Connector reads (get_google_analytics_data, get_search_console_data,
3456
3456
  // get_posthog_analytics) ───
3457
3457
  //
3458
3458
  // Every one is a stored sync, so "as of" leads the card: a number drawn
@@ -3691,10 +3691,10 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
3691
3691
  var srcUrl=src&&(src.externalUrl||src.url);
3692
3692
  var args=JSON.stringify({url:srcUrl});
3693
3693
  var follow=srcUrl?'<div class="nt-feeds-ai is-foot"><div class="nt-feeds-ai-row ai-actions">'
3694
- +aiBtn("create_variants","Create variants",args)
3695
- +aiBtn("write_hooks","More hooks",args)
3696
- +aiBtn("repurpose_post","Repurpose",args)
3697
- +aiBtn("analyze_comments","Read comments",args)
3694
+ +aiBtn("generate_post_variants","Create variants",args)
3695
+ +aiBtn("generate_hook_ideas","More hooks",args)
3696
+ +aiBtn("adapt_post_for_platform","Repurpose",args)
3697
+ +aiBtn("summarize_post_comments","Read comments",args)
3698
3698
  +'</div><p class="nt-feeds-ai-note ai-note">Each action runs a tool and spends the credits shown.</p></div>':"";
3699
3699
 
3700
3700
  if(!meters&&!chips.length&&!a.summary&&!parts)return postHtml;
@@ -4121,7 +4121,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
4121
4121
  footer:derived&&d.note?'<span class="nt-signals-caveat">'+ic("info",14)+"<span>"+esc(String(d.note))+"</span></span>":""});
4122
4122
  }
4123
4123
 
4124
- // ─── Comment analysis (analyze_comments) ───
4124
+ // ─── Comment analysis (summarize_post_comments) ───
4125
4125
  // The report's own verdict, and the sample it rests on, always: a verdict
4126
4126
  // drawn from 12 comments must not read like one drawn from 500.
4127
4127
  function renderCommentReport(d){
@@ -5394,7 +5394,7 @@ export const NOOTICR_UI_TEMPLATE = `<!DOCTYPE html>
5394
5394
  // Fallback. The guidance field is prose written for the model, not data —
5395
5395
  // dumped into the JSON block it reads as a wall of escaped text, and it is
5396
5396
  // the longest string in most payloads. Drawn above the block and dropped
5397
- // from it. This is also what gives score_draft a view worth looking at:
5397
+ // from it. This is also what gives evaluate_social_draft a view worth looking at:
5398
5398
  // its rubric IS its answer.
5399
5399
  var rest=d,lead="";
5400
5400
  if(d&&typeof d==="object"&&typeof d.guidance==="string"){
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nooticr/mcp",
3
3
  "mcpName": "com.nooticr/mcp",
4
- "version": "1.26.54",
4
+ "version": "1.26.56",
5
5
  "description": "MCP server for nooticr - fetch, discover and understand TikTok/Instagram/YouTube/X/Reddit/LinkedIn/Weibo posts with AI (media metadata, niche discovery, brand monitoring, hook & viral analysis)",
6
6
  "homepage": "https://mcp.nooticr.com",
7
7
  "repository": {