@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.
- package/README.md +18 -16
- package/dist/shared/amazon.js +1 -1
- package/dist/shared/comment-review.js +2 -2
- package/dist/shared/evidence-digest.js +1 -1
- package/dist/shared/evidence.js +7 -7
- package/dist/shared/getting-started.js +2 -2
- package/dist/shared/handoff.js +2 -2
- package/dist/shared/hashtags.js +1 -1
- package/dist/shared/jobs.js +3 -3
- package/dist/shared/loading-plans.js +12 -10
- package/dist/shared/output-schemas.js +8 -8
- package/dist/shared/own-account.js +1 -1
- package/dist/shared/prompts.js +7 -7
- package/dist/shared/settings.js +69 -0
- package/dist/shared/tasks.js +1 -1
- package/dist/shared/tools-def.js +26 -14
- package/dist/shared/tools.js +217 -76
- package/dist/shared/ui-template.js +26 -26
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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
|
-
|
|
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.
|
|
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,
|
|
1126
|
-
|
|
1127
|
-
|
|
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("
|
|
1241
|
-
+aiBtn("
|
|
1242
|
-
+aiBtn("
|
|
1243
|
-
+aiBtn("
|
|
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.
|
|
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
|
|
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("
|
|
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 (
|
|
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.
|
|
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
|
|
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
|
-
//
|
|
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("
|
|
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
|
-
*
|
|
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 (
|
|
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("
|
|
3695
|
-
+aiBtn("
|
|
3696
|
-
+aiBtn("
|
|
3697
|
-
+aiBtn("
|
|
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 (
|
|
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
|
|
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.
|
|
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": {
|