@nooticr/mcp 1.26.53 → 1.26.54
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/dist/shared/own-account.js +1 -1
- package/dist/shared/tools-def.js +10 -10
- package/dist/shared/tools.js +10 -10
- package/package.json +1 -1
|
@@ -383,7 +383,7 @@ export function registerOwnAccountTools(server, makeClient) {
|
|
|
383
383
|
return failed(`${name} failed`, err);
|
|
384
384
|
}
|
|
385
385
|
});
|
|
386
|
-
connectorRead("get_google_analytics", "google_analytics", "
|
|
386
|
+
connectorRead("get_google_analytics", "google_analytics", "Read Google Analytics Data", "Your own product's Google Analytics (GA4) sync, as of its last sync into nooticr — not a live " +
|
|
387
387
|
"GA4 call: the property, the date range synced and how many daily rows came in. The metrics " +
|
|
388
388
|
"themselves (installs, opens, purchases, revenue) feed get_post_performance and growth_brief " +
|
|
389
389
|
"rather than being repeated here. Returns a message rather than an error when nothing has " +
|
package/dist/shared/tools-def.js
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
export const TOOL_DEFINITIONS = [
|
|
3
3
|
{
|
|
4
4
|
name: "analyze_post",
|
|
5
|
-
title: "
|
|
5
|
+
title: "Inspect Social Media Post",
|
|
6
6
|
description: "Frames sampled evenly across a social post (video, image, carousel/slideshow), returned as real images you can look at, together with the post's transcript, caption and stats. It hands you the material rather than a verdict: read the frames and the words, then work out the hook, the structure, the visual style, the CTA and the audience yourself, citing the frame or line behind each claim. Supports TikTok, Instagram, YouTube, X, Reddit, Douyin, Xiaohongshu, Weibo, Bilibili and LinkedIn. Use when the visuals are the point — framing, editing, on-screen text; analyze_post_fast reads the same post without the frames for one credit less. Fans out to get_post_frames and get_post_transcript: 3 nooticr credits, 2 for the frames plus 1 for the transcript.",
|
|
7
7
|
inputSchema: z.object({ url: z.string().describe("Public post URL (TikTok/Instagram/YouTube/X/Reddit/Douyin/Xiaohongshu/Weibo/Bilibili/LinkedIn).") }).strict(),
|
|
8
8
|
},
|
|
@@ -26,7 +26,7 @@ export const TOOL_DEFINITIONS = [
|
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
name: "analyze_creator_profile",
|
|
29
|
-
title: "
|
|
29
|
+
title: "Research Creator Profile",
|
|
30
30
|
description: "A creator's recent posts with their stats, on TikTok, Instagram, YouTube, Reddit, Douyin, Xiaohongshu, X, Weibo, Bilibili or LinkedIn — the raw material of a profile teardown, for you to read. Work out their niche, content themes, hook formula, strengths and weaknesses, engagement pattern and audience from the spread of the numbers rather than the best post, and name the posts you reason from. find_hook_pattern fetches the same posts and asks only for the formula. Costs 2 nooticr credits, for the one get_user_posts call it makes.",
|
|
31
31
|
inputSchema: z.object({ username: z.string().describe("Creator handle, e.g. 'zoundsapp'."), platform: z.enum(["tiktok", "instagram", "youtube", "douyin", "xiaohongshu", "twitter", "bilibili", "reddit", "weibo"]).optional().describe("Which platform (default tiktok)."), limit: z.number().int().optional().describe("Posts to fetch (default 6; first 3 analyzed)."), focus: z.string().optional().describe("Extra instruction for the profile synthesis.") }).strict(),
|
|
32
32
|
},
|
|
@@ -80,13 +80,13 @@ export const TOOL_DEFINITIONS = [
|
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
name: "analyze_comments",
|
|
83
|
-
title: "
|
|
83
|
+
title: "Summarize Post Comments",
|
|
84
84
|
description: "A post's comment section, fetched and laid out for you to classify: every comment with a stable id, plus whatever themes the platform clustered them into. Label each one's sentiment and what it is doing — praise, complaint, bug report, question, request, comparison, spam — then summarise the themes, the questions worth answering, the objections, and what to make next. The result names the exact labels, and show_comment_review draws them for free afterwards. Use when the goal is 'what should I make next' rather than 'what did people write'. Costs 2 nooticr credits, for the one get_post_comments call it makes.",
|
|
85
85
|
inputSchema: z.object({ url: z.string().describe("Full public post URL."), limit: z.number().int().optional().describe("Comments to read (default 50, max 100)."), verbatim: z.boolean().optional().describe("Render every comment whole in the text you read (default false).") }).strict(),
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
88
|
name: "compare_posts",
|
|
89
|
-
title: "Compare
|
|
89
|
+
title: "Compare Social Post Performance",
|
|
90
90
|
description: "The first of 2-5 posts you want compared, fetched with its stats — and the comparison left to you. Call get_social_media on each remaining URL yourself (1 credit each), and get_post_transcript where the wording matters, then say which won, what actually differed (hook, format, length, caption, hashtags), what they share worth keeping, and the one experiment that would test your explanation. Use for 'why did this one work and that one not'. Costs 1 nooticr credit for this call, plus 1 per further post you fetch.",
|
|
91
91
|
inputSchema: z.object({ urls: z.array(z.string()).describe("2-5 post URLs to compare.") }).strict(),
|
|
92
92
|
},
|
|
@@ -98,31 +98,31 @@ export const TOOL_DEFINITIONS = [
|
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
100
|
name: "analyze_post_fast",
|
|
101
|
-
title: "
|
|
101
|
+
title: "Quick Social Post Analysis",
|
|
102
102
|
description: "A post's transcript, caption and stats, with no frames — which is what makes it the cheap read. Work out the hook, the script structure, the CTA and the audience from the words and the numbers yourself, and say plainly that you have not seen the visuals. Use this by default; call analyze_post when a judgement actually needs the frames. Fans out to get_social_media and get_post_transcript: 2 nooticr credits, 1 each.",
|
|
103
103
|
inputSchema: z.object({ url: z.string().describe("Full public post URL.") }).strict(),
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
name: "write_hooks",
|
|
107
|
-
title: "
|
|
107
|
+
title: "Generate Hooks from a Post",
|
|
108
108
|
description: "The source post, its transcript and its stats, so you can write the opening lines yourself — the first line said or shown on screen. Name the device each hook uses and who it stops; one that could open any video in the niche is not grounded in this one. Use when you know the subject and need openings to choose between. With a url it fetches get_social_media and get_post_transcript for 2 nooticr credits; with only a topic there is nothing to fetch and it costs nothing.",
|
|
109
109
|
inputSchema: z.object({ url: z.string().optional().describe("Post to riff on (optional if topic given)."), topic: z.string().optional().describe("Subject to write hooks about (optional if url given)."), count: z.number().int().optional().describe("How many hooks (default 10, max 20)."), tone: z.string().optional().describe("Optional tone, e.g. 'blunt', 'contrarian'.") }).strict(),
|
|
110
110
|
},
|
|
111
111
|
{
|
|
112
112
|
name: "create_variants",
|
|
113
|
-
title: "
|
|
113
|
+
title: "Generate Post Variants",
|
|
114
114
|
description: "The post that worked, with its transcript and stats, so you can propose what to film next — same underlying mechanism, different execution. For each variant give the hook, the one angle that changes, the shot beats in order and the CTA, and say what made the original work. Use after reading a post to move from 'why it worked' to 'what to make'. Fans out to get_social_media and get_post_transcript: 2 nooticr credits, 1 each.",
|
|
115
115
|
inputSchema: z.object({ url: z.string().describe("The post to make variants of."), count: z.number().int().optional().describe("How many variants (default 3, max 6)."), angle: z.string().optional().describe("Optional steer, e.g. 'for a beginner audience'.") }).strict(),
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
name: "score_draft",
|
|
119
|
-
title: "Score Draft",
|
|
119
|
+
title: "Score a Social Media Draft",
|
|
120
120
|
description: "Score your own draft BEFORE you film or post it. Returns the draft with the rubric to hold it to — hook, clarity, payoff, specificity and fit, each scored 1-10 — and asks you for the three fixes that would move it most, one rewritten opening line and a tightened version. The only tool that runs before the content exists. Use before filming, while changing it is still cheap. Free: it fetches nothing, so it costs no credits.",
|
|
121
121
|
inputSchema: z.object({ draft: z.string().describe("Your script, caption or hook."), platform: z.string().optional().describe("Target platform (default tiktok).") }).strict(),
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
124
|
name: "repurpose_post",
|
|
125
|
-
title: "
|
|
125
|
+
title: "Adapt a Post for Another Platform",
|
|
126
126
|
description: "The source post, its transcript and its stats, for you to rewrite for other surfaces — X thread, LinkedIn post, carousel slides, YouTube title/description, newsletter — keeping the argument and changing the shape to suit how each is read. The same paragraph with different line breaks is not a repurposing. Use when a post already worked and you want it on other surfaces. Fans out to get_social_media and get_post_transcript: 2 nooticr credits, 1 each.",
|
|
127
127
|
inputSchema: z.object({ url: z.string().describe("The post to repurpose."), targets: z.array(z.string()).optional().describe("Which formats to produce (default all).") }).strict(),
|
|
128
128
|
},
|
|
@@ -338,7 +338,7 @@ export const TOOL_DEFINITIONS = [
|
|
|
338
338
|
},
|
|
339
339
|
{
|
|
340
340
|
name: "get_google_analytics",
|
|
341
|
-
title: "
|
|
341
|
+
title: "Read Google Analytics Data",
|
|
342
342
|
description: "Your own product's Google Analytics (GA4) sync, as of its last sync into nooticr — not a live GA4 call: the property, the date range synced and how many daily rows came in. Connect GA4 in API Connections first. No cost to call.",
|
|
343
343
|
inputSchema: z.object({ appId: z.number().int().optional().describe("Your product's id. Omit only with a single-app workspace.") }).strict(),
|
|
344
344
|
},
|
package/dist/shared/tools.js
CHANGED
|
@@ -30,7 +30,7 @@ import { registerCollabTools } from "./collab.js";
|
|
|
30
30
|
import { registerAmazonTools } from "./amazon.js";
|
|
31
31
|
import { registerMarketplaceTools } from "./marketplace.js";
|
|
32
32
|
/** Current MCP server version — bumped on every deploy for traceability. */
|
|
33
|
-
export const MCP_SERVER_VERSION = "1.26.
|
|
33
|
+
export const MCP_SERVER_VERSION = "1.26.54";
|
|
34
34
|
/** MCP Apps extension identifier */
|
|
35
35
|
const UI_EXTENSION = "io.modelcontextprotocol/ui";
|
|
36
36
|
/** MIME type for MCP Apps HTML resources */
|
|
@@ -891,7 +891,7 @@ export function createMcpServer(rawMakeClient, opts) {
|
|
|
891
891
|
});
|
|
892
892
|
}
|
|
893
893
|
registerSlowTool(server, "analyze_post", {
|
|
894
|
-
title: "
|
|
894
|
+
title: "Inspect Social Media Post",
|
|
895
895
|
description: "Frames sampled evenly across a social post (video, image, carousel/slideshow), returned as " +
|
|
896
896
|
"real images you can look at, together with the post's transcript, caption and stats. " +
|
|
897
897
|
"This is the material an analysis is built from, not an analysis: read the frames and the " +
|
|
@@ -1035,7 +1035,7 @@ export function createMcpServer(rawMakeClient, opts) {
|
|
|
1035
1035
|
}
|
|
1036
1036
|
});
|
|
1037
1037
|
registerSlowTool(server, "analyze_creator_profile", {
|
|
1038
|
-
title: "
|
|
1038
|
+
title: "Research Creator Profile",
|
|
1039
1039
|
description: "A creator's recent posts with their stats, on TikTok, Instagram, YouTube, Reddit, Douyin, " +
|
|
1040
1040
|
"Xiaohongshu, X, Weibo, Bilibili or LinkedIn — the raw material of a profile teardown. " +
|
|
1041
1041
|
"Work out their niche, recurring themes, hook formula, what over- and under-performs and who " +
|
|
@@ -1441,7 +1441,7 @@ export function createMcpServer(rawMakeClient, opts) {
|
|
|
1441
1441
|
}
|
|
1442
1442
|
});
|
|
1443
1443
|
server.registerTool("analyze_comments", {
|
|
1444
|
-
title: "
|
|
1444
|
+
title: "Summarize Post Comments",
|
|
1445
1445
|
description: "A post's comment section, fetched and laid out for you to classify: every comment with a " +
|
|
1446
1446
|
"stable id, plus whatever themes the platform clustered them into. Label each one's sentiment " +
|
|
1447
1447
|
"and what it is doing — praise, complaint, bug report, question, request, comparison, spam — " +
|
|
@@ -2063,7 +2063,7 @@ export function createMcpServer(rawMakeClient, opts) {
|
|
|
2063
2063
|
};
|
|
2064
2064
|
});
|
|
2065
2065
|
server.registerTool("compare_posts", {
|
|
2066
|
-
title: "Compare
|
|
2066
|
+
title: "Compare Social Post Performance",
|
|
2067
2067
|
description: "The first of 2-5 posts you want compared, fetched with its stats — and the comparison left " +
|
|
2068
2068
|
"to you. Call get_social_media on each remaining URL yourself (1 credit each), plus " +
|
|
2069
2069
|
"get_post_transcript where the wording matters, then say which won, what actually differed " +
|
|
@@ -2180,7 +2180,7 @@ export function createMcpServer(rawMakeClient, opts) {
|
|
|
2180
2180
|
}
|
|
2181
2181
|
});
|
|
2182
2182
|
server.registerTool("analyze_post_fast", {
|
|
2183
|
-
title: "
|
|
2183
|
+
title: "Quick Social Post Analysis",
|
|
2184
2184
|
description: "A post's transcript, caption and stats, with no frames — which is what makes it the cheap " +
|
|
2185
2185
|
"read. Work out the hook, the script structure, the CTA and the audience from the words and " +
|
|
2186
2186
|
"the numbers yourself, and say plainly that you have not seen the visuals. " +
|
|
@@ -2210,7 +2210,7 @@ export function createMcpServer(rawMakeClient, opts) {
|
|
|
2210
2210
|
}
|
|
2211
2211
|
});
|
|
2212
2212
|
server.registerTool("write_hooks", {
|
|
2213
|
-
title: "
|
|
2213
|
+
title: "Generate Hooks from a Post",
|
|
2214
2214
|
description: "The source post, its transcript and its stats, so you can write the opening lines yourself — " +
|
|
2215
2215
|
"the first line said or shown on screen. For each hook you write, name the device it uses and " +
|
|
2216
2216
|
"who it stops; a hook that could open any video in the niche is not grounded in this one. " +
|
|
@@ -2244,7 +2244,7 @@ export function createMcpServer(rawMakeClient, opts) {
|
|
|
2244
2244
|
}
|
|
2245
2245
|
});
|
|
2246
2246
|
server.registerTool("create_variants", {
|
|
2247
|
-
title: "
|
|
2247
|
+
title: "Generate Post Variants",
|
|
2248
2248
|
description: "The post that worked, with its transcript and stats, so you can propose what to film next: " +
|
|
2249
2249
|
"for each variant, the hook, the one angle that changes, the shot beats in order and the CTA. " +
|
|
2250
2250
|
"Keep whatever made the original work and say what that was. " +
|
|
@@ -2276,7 +2276,7 @@ export function createMcpServer(rawMakeClient, opts) {
|
|
|
2276
2276
|
}
|
|
2277
2277
|
});
|
|
2278
2278
|
server.registerTool("score_draft", {
|
|
2279
|
-
title: "Score Draft",
|
|
2279
|
+
title: "Score a Social Media Draft",
|
|
2280
2280
|
description: "Score your own draft BEFORE you film or post it. Returns the draft alongside the rubric to " +
|
|
2281
2281
|
"hold it to — hook, clarity, payoff, specificity and fit, each scored 1-10 — and asks you for " +
|
|
2282
2282
|
"the three fixes that would move it most, one rewritten opening line and a tightened version. " +
|
|
@@ -2321,7 +2321,7 @@ export function createMcpServer(rawMakeClient, opts) {
|
|
|
2321
2321
|
};
|
|
2322
2322
|
});
|
|
2323
2323
|
server.registerTool("repurpose_post", {
|
|
2324
|
-
title: "
|
|
2324
|
+
title: "Adapt a Post for Another Platform",
|
|
2325
2325
|
description: "The source post, its transcript and its stats, for you to rewrite for other surfaces — X " +
|
|
2326
2326
|
"thread, LinkedIn post, carousel slides, YouTube title/description, newsletter. Each surface " +
|
|
2327
2327
|
"has its own length, register and conventions: the same paragraph with different line breaks " +
|
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.54",
|
|
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": {
|