@clipform/mcp-server 1.1.3 → 1.3.1

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.
Files changed (51) hide show
  1. package/README.md +17 -43
  2. package/dist/__tests__/api-parity.test.d.ts +1 -0
  3. package/dist/__tests__/api-parity.test.js +148 -0
  4. package/dist/__tests__/api-parity.test.js.map +1 -0
  5. package/dist/lib/api-client.js +2 -2
  6. package/dist/lib/api-client.js.map +1 -1
  7. package/dist/lib/config.js +31 -21
  8. package/dist/lib/config.js.map +1 -1
  9. package/dist/lib/schemas.d.ts +28 -2
  10. package/dist/lib/schemas.js +9 -5
  11. package/dist/lib/schemas.js.map +1 -1
  12. package/dist/prompts.js +17 -5
  13. package/dist/prompts.js.map +1 -1
  14. package/dist/server.js +5 -21
  15. package/dist/server.js.map +1 -1
  16. package/dist/tools/add-question.js +4 -4
  17. package/dist/tools/create-form.js +64 -20
  18. package/dist/tools/create-form.js.map +1 -1
  19. package/dist/tools/generate-slideshow.js +1 -1
  20. package/dist/tools/generate-tts.js +2 -2
  21. package/dist/tools/generate-tts.js.map +1 -1
  22. package/dist/tools/search-media.d.ts +2 -0
  23. package/dist/tools/search-media.js +40 -0
  24. package/dist/tools/search-media.js.map +1 -0
  25. package/dist/tools/search-news.js +13 -4
  26. package/dist/tools/search-news.js.map +1 -1
  27. package/dist/tools/update-form.js +59 -2
  28. package/dist/tools/update-form.js.map +1 -1
  29. package/dist/tools/update-question.js +8 -3
  30. package/dist/tools/update-question.js.map +1 -1
  31. package/dist/tools/upload-question-media.js +36 -8
  32. package/dist/tools/upload-question-media.js.map +1 -1
  33. package/package.json +35 -36
  34. package/dist/tools/get-daily-content.d.ts +0 -2
  35. package/dist/tools/get-daily-content.js +0 -66
  36. package/dist/tools/get-daily-content.js.map +0 -1
  37. package/dist/tools/get-trivia.d.ts +0 -2
  38. package/dist/tools/get-trivia.js +0 -49
  39. package/dist/tools/get-trivia.js.map +0 -1
  40. package/dist/tools/lookup-country.d.ts +0 -2
  41. package/dist/tools/lookup-country.js +0 -38
  42. package/dist/tools/lookup-country.js.map +0 -1
  43. package/dist/tools/search-images.d.ts +0 -2
  44. package/dist/tools/search-images.js +0 -36
  45. package/dist/tools/search-images.js.map +0 -1
  46. package/dist/tools/search-knowledge.d.ts +0 -2
  47. package/dist/tools/search-knowledge.js +0 -40
  48. package/dist/tools/search-knowledge.js.map +0 -1
  49. package/dist/tools/search-videos.d.ts +0 -2
  50. package/dist/tools/search-videos.js +0 -37
  51. package/dist/tools/search-videos.js.map +0 -1
package/package.json CHANGED
@@ -1,36 +1,35 @@
1
- {
2
- "name": "@clipform/mcp-server",
3
- "version": "1.1.3",
4
- "description": "MCP server for building and managing Clipform video forms",
5
- "license": "MIT",
6
- "homepage": "https://clipform.io",
7
- "type": "module",
8
- "main": "dist/index.js",
9
- "exports": {
10
- ".": "./dist/index.js",
11
- "./server": "./dist/server.js"
12
- },
13
- "bin": {
14
- "mcp-server-clipform": "dist/index.js"
15
- },
16
- "files": [
17
- "dist"
18
- ],
19
- "scripts": {
20
- "start": "node dist/index.js",
21
- "dev": "tsx watch src/index.ts",
22
- "build": "tsc",
23
- "test": "vitest run",
24
- "prepare": "npm run build"
25
- },
26
- "dependencies": {
27
- "@modelcontextprotocol/sdk": "^1.12.1",
28
- "zod": "^3.24.4"
29
- },
30
- "devDependencies": {
31
- "@vid-master/config": "*",
32
- "tsx": "^4.19.4",
33
- "typescript": "^5.2.2",
34
- "vitest": "^3.1.1"
35
- }
36
- }
1
+ {
2
+ "name": "@clipform/mcp-server",
3
+ "version": "1.3.1",
4
+ "description": "MCP server for building and managing Clipform video forms",
5
+ "license": "MIT",
6
+ "homepage": "https://clipform.io",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "exports": {
10
+ ".": "./dist/index.js",
11
+ "./server": "./dist/server.js"
12
+ },
13
+ "bin": {
14
+ "mcp-server-clipform": "dist/index.js"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "start": "node dist/index.js",
21
+ "dev": "tsx watch src/index.ts",
22
+ "build": "tsc",
23
+ "test": "vitest run"
24
+ },
25
+ "dependencies": {
26
+ "@modelcontextprotocol/sdk": "^1.12.1",
27
+ "@vid-master/config": "*",
28
+ "zod": "^3.24.4"
29
+ },
30
+ "devDependencies": {
31
+ "tsx": "^4.19.4",
32
+ "typescript": "^5.2.2",
33
+ "vitest": "^3.1.1"
34
+ }
35
+ }
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerGetDailyContentTool(server: McpServer): void;
@@ -1,66 +0,0 @@
1
- import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
2
- function truncate(text, maxLength = 500) {
3
- if (text.length <= maxLength)
4
- return text;
5
- return text.slice(0, maxLength - 3) + "...";
6
- }
7
- export function registerGetDailyContentTool(server) {
8
- server.registerTool("formgen_get_daily_content", {
9
- title: "Get Daily Content",
10
- description: `Get today's rotating content for quiz generation. Returns NASA's Astronomy Picture of the Day and Wikipedia's featured content (featured article, "on this day" events, most-read articles, current news). Great for generating daily quizzes with fresh content.`,
11
- inputSchema: {},
12
- annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: true },
13
- }, async () => {
14
- const result = await callInternalApi("/internal/formgen/get-daily-content", {});
15
- if (!result.ok)
16
- return errorResult(result.error);
17
- const daily = result.data.daily;
18
- const lines = [];
19
- if (daily.nasaApod) {
20
- const a = daily.nasaApod;
21
- lines.push("## NASA Astronomy Picture of the Day");
22
- lines.push(`Title: ${a.title}`);
23
- lines.push(`Date: ${a.date}`);
24
- lines.push(`Type: ${a.mediaType}`);
25
- lines.push(`URL: ${a.url}`);
26
- if (a.hdUrl)
27
- lines.push(`HD URL: ${a.hdUrl}`);
28
- lines.push(`Explanation: ${truncate(a.explanation, 400)}`);
29
- if (a.copyright)
30
- lines.push(`Copyright: ${a.copyright}`);
31
- lines.push("");
32
- }
33
- if (daily.wikipedia) {
34
- const w = daily.wikipedia;
35
- if (w.todaysFeaturedArticle) {
36
- lines.push("## Wikipedia Featured Article");
37
- lines.push(`Title: ${w.todaysFeaturedArticle.title}`);
38
- lines.push(truncate(w.todaysFeaturedArticle.extract, 300));
39
- lines.push("");
40
- }
41
- if (w.onThisDay?.length > 0) {
42
- lines.push(`## On This Day (${w.onThisDay.length} events)`);
43
- for (const event of w.onThisDay.slice(0, 8)) {
44
- lines.push(`- ${event.year}: ${event.text}`);
45
- }
46
- lines.push("");
47
- }
48
- if (w.mostRead?.length > 0) {
49
- lines.push(`## Most Read Today (top 10)`);
50
- for (const article of w.mostRead.slice(0, 10)) {
51
- lines.push(`- ${article.title}: ${truncate(article.extract, 100)}`);
52
- }
53
- lines.push("");
54
- }
55
- if (w.newsItems?.length > 0) {
56
- lines.push(`## In The News`);
57
- for (const item of w.newsItems.slice(0, 5)) {
58
- lines.push(`- ${item.story}`);
59
- }
60
- lines.push("");
61
- }
62
- }
63
- return textResult(lines.join("\n"));
64
- });
65
- }
66
- //# sourceMappingURL=get-daily-content.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-daily-content.js","sourceRoot":"","sources":["../../src/tools/get-daily-content.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerGetTriviaTool(server: McpServer): void;
@@ -1,49 +0,0 @@
1
- import { z } from "zod";
2
- import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
3
- const CATEGORIES = [
4
- "General Knowledge", "Entertainment: Books", "Entertainment: Film",
5
- "Entertainment: Music", "Entertainment: Musicals & Theatres",
6
- "Entertainment: Television", "Entertainment: Video Games",
7
- "Entertainment: Board Games", "Science & Nature", "Science: Computers",
8
- "Science: Mathematics", "Science: Gadgets", "Mythology", "Sports",
9
- "Geography", "History", "Politics", "Art", "Celebrities", "Animals",
10
- "Vehicles", "Entertainment: Comics", "Entertainment: Japanese Anime & Manga",
11
- "Entertainment: Cartoon & Animations",
12
- ];
13
- export function registerGetTriviaTool(server) {
14
- server.registerTool("formgen_get_trivia", {
15
- title: "Get Trivia Questions",
16
- description: `Get ready-made trivia questions from the Open Trivia Database (4,000+ questions across 24 categories). NOT keyword-searchable - works by category and difficulty only. Each question includes the correct answer, incorrect answers, category, and difficulty level.
17
-
18
- Available categories: ${CATEGORIES.join(", ")}`,
19
- inputSchema: {
20
- amount: z.number().min(1).max(50).default(10).optional()
21
- .describe("Number of questions (default 10)"),
22
- category: z.string().optional()
23
- .describe("Category name (must match exactly from the list)"),
24
- difficulty: z.enum(["easy", "medium", "hard"]).optional()
25
- .describe("Difficulty level"),
26
- },
27
- annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: true },
28
- }, async ({ amount, category, difficulty }) => {
29
- const result = await callInternalApi("/internal/formgen/get-trivia", {
30
- body: { amount, category, difficulty },
31
- });
32
- if (!result.ok)
33
- return errorResult(result.error);
34
- const results = result.data.results;
35
- if (!results.length)
36
- return textResult("No trivia questions returned. Try a different category or fewer questions.");
37
- const lines = [`${results.length} trivia questions:\n`];
38
- for (let i = 0; i < results.length; i++) {
39
- const q = results[i];
40
- lines.push(`${i + 1}. [${q.difficulty}] ${q.question}`);
41
- lines.push(` Correct: ${q.correctAnswer}`);
42
- lines.push(` Wrong: ${q.incorrectAnswers.join(", ")}`);
43
- lines.push(` Category: ${q.category}`);
44
- lines.push("");
45
- }
46
- return textResult(lines.join("\n"));
47
- });
48
- }
49
- //# sourceMappingURL=get-trivia.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-trivia.js","sourceRoot":"","sources":["../../src/tools/get-trivia.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerLookupCountryTool(server: McpServer): void;
@@ -1,38 +0,0 @@
1
- import { z } from "zod";
2
- import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
3
- export function registerLookupCountryTool(server) {
4
- server.registerTool("formgen_lookup_country", {
5
- title: "Lookup Country",
6
- description: `Look up country data by name. Returns structured info including capital, population, languages, currencies, flag URLs, borders, and timezones. Partial name matching works (e.g. "united" returns United Kingdom, United States, etc.). Useful for geography quiz questions.`,
7
- inputSchema: {
8
- name: z.string().describe("Country name or partial name (e.g. 'France', 'united', 'japan')"),
9
- },
10
- annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
11
- }, async ({ name }) => {
12
- const result = await callInternalApi("/internal/formgen/lookup-country", {
13
- body: { name },
14
- });
15
- if (!result.ok)
16
- return errorResult(result.error);
17
- const country = result.data.country;
18
- if (!country)
19
- return textResult(`No country found for "${name}".`);
20
- const lines = [
21
- `Country: ${country.name}`,
22
- `Official name: ${country.officialName}`,
23
- `Capital: ${country.capital || "N/A"}`,
24
- `Region: ${country.region}${country.subregion ? ` (${country.subregion})` : ""}`,
25
- `Population: ${Number(country.population).toLocaleString()}`,
26
- `Area: ${country.area ? `${Number(country.area).toLocaleString()} km²` : "N/A"}`,
27
- `Languages: ${country.languages?.join(", ") || "N/A"}`,
28
- `Currencies: ${country.currencies?.map((c) => `${c.name} (${c.symbol})`).join(", ") || "N/A"}`,
29
- `Timezones: ${country.timezones?.join(", ")}`,
30
- `Borders: ${country.borders?.join(", ") || "None (island/isolated)"}`,
31
- `Flag (PNG): ${country.flagPng}`,
32
- `Flag (SVG): ${country.flagSvg}`,
33
- country.coatOfArmsUrl ? `Coat of arms: ${country.coatOfArmsUrl}` : "",
34
- ].filter(Boolean);
35
- return textResult(lines.join("\n"));
36
- });
37
- }
38
- //# sourceMappingURL=lookup-country.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lookup-country.js","sourceRoot":"","sources":["../../src/tools/lookup-country.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,8QAA8Q;QAC3R,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;SAC7F;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACvG,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,kCAAkC,EAAE;YACvE,IAAI,EAAE,EAAE,IAAI,EAAE;SACf,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAI,MAAM,CAAC,IAAY,CAAC,OAAO,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,UAAU,CAAC,yBAAyB,IAAI,IAAI,CAAC,CAAC;QAEnE,MAAM,KAAK,GAAG;YACZ,YAAY,OAAO,CAAC,IAAI,EAAE;YAC1B,kBAAkB,OAAO,CAAC,YAAY,EAAE;YACxC,YAAY,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE;YACtC,WAAW,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChF,eAAe,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE;YAC5D,SAAS,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE;YAChF,cAAc,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE;YACtD,eAAe,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE;YACnG,cAAc,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7C,YAAY,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,wBAAwB,EAAE;YACrE,eAAe,OAAO,CAAC,OAAO,EAAE;YAChC,eAAe,OAAO,CAAC,OAAO,EAAE;YAChC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE;SACtE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAElB,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerSearchImagesTool(server: McpServer): void;
@@ -1,36 +0,0 @@
1
- import { z } from "zod";
2
- import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
3
- export function registerSearchImagesTool(server) {
4
- server.registerTool("formgen_search_images", {
5
- title: "Search Images",
6
- description: `Search for royalty-free images across multiple providers (Pexels, Unsplash, Pixabay, Wikimedia Commons, NASA, iNaturalist). Automatically routes to the most relevant providers based on the query topic. Returns image URLs you can use with clipform_upload_media or clipform_generate_slideshow.`,
7
- inputSchema: {
8
- query: z.string().describe("Search query (e.g. 'komodo dragon', 'saturn rings', 'french cuisine')"),
9
- count: z.number().min(1).max(20).default(6).optional()
10
- .describe("Max results per provider (default 6)"),
11
- },
12
- annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
13
- }, async ({ query, count }) => {
14
- const result = await callInternalApi("/internal/formgen/search-images", {
15
- body: { query, count },
16
- });
17
- if (!result.ok)
18
- return errorResult(result.error);
19
- const results = result.data.results;
20
- if (!results.length)
21
- return textResult(`No images found for "${query}".`);
22
- const lines = [`Found ${results.length} images for "${query}":\n`];
23
- for (const img of results.slice(0, 15)) {
24
- lines.push(`- [${img.source}] ${img.title}`);
25
- lines.push(` URL: ${img.url}`);
26
- if (img.width && img.height)
27
- lines.push(` Size: ${img.width}x${img.height}`);
28
- if (img.attribution)
29
- lines.push(` Attribution: ${img.attribution}`);
30
- lines.push(` License: ${img.license}`);
31
- lines.push("");
32
- }
33
- return textResult(lines.join("\n"));
34
- });
35
- }
36
- //# sourceMappingURL=search-images.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-images.js","sourceRoot":"","sources":["../../src/tools/search-images.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,qSAAqS;QAClT,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;YACnG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACnD,QAAQ,CAAC,sCAAsC,CAAC;SACpD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACvG,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,iCAAiC,EAAE;YACtE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAI,MAAM,CAAC,IAAY,CAAC,OAAgB,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC,wBAAwB,KAAK,IAAI,CAAC,CAAC;QAE1E,MAAM,KAAK,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,gBAAgB,KAAK,MAAM,CAAC,CAAC;QACnE,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAChC,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,IAAI,GAAG,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerSearchKnowledgeTool(server: McpServer): void;
@@ -1,40 +0,0 @@
1
- import { z } from "zod";
2
- import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
3
- function truncate(text, maxLength = 500) {
4
- if (text.length <= maxLength)
5
- return text;
6
- return text.slice(0, maxLength - 3) + "...";
7
- }
8
- export function registerSearchKnowledgeTool(server) {
9
- server.registerTool("formgen_search_knowledge", {
10
- title: "Search Knowledge",
11
- description: `Search Wikipedia for encyclopaedia-quality information about a topic. Returns article summaries with thumbnails. Use this to research a topic before crafting quiz questions.`,
12
- inputSchema: {
13
- query: z.string().describe("Topic to research (e.g. 'komodo dragon', 'black holes', 'French Revolution')"),
14
- count: z.number().min(1).max(10).default(3).optional()
15
- .describe("Number of articles to return (default 3)"),
16
- },
17
- annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
18
- }, async ({ query, count }) => {
19
- const result = await callInternalApi("/internal/formgen/search-knowledge", {
20
- body: { query, count },
21
- });
22
- if (!result.ok)
23
- return errorResult(result.error);
24
- const results = result.data.results;
25
- if (!results.length)
26
- return textResult(`No knowledge articles found for "${query}".`);
27
- const lines = [`Found ${results.length} articles for "${query}":\n`];
28
- for (const article of results) {
29
- lines.push(`## ${article.title}`);
30
- lines.push(truncate(article.summary, 600));
31
- if (article.thumbnailUrl)
32
- lines.push(`Thumbnail: ${article.thumbnailUrl}`);
33
- if (article.sourceUrl)
34
- lines.push(`Source: ${article.sourceUrl}`);
35
- lines.push("");
36
- }
37
- return textResult(lines.join("\n"));
38
- });
39
- }
40
- //# sourceMappingURL=search-knowledge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-knowledge.js","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAS,GAAG,GAAG;IAC7C,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,+KAA+K;QAC5L,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8EAA8E,CAAC;YAC1G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACnD,QAAQ,CAAC,0CAA0C,CAAC;SACxD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACvG,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,oCAAoC,EAAE;YACzE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAI,MAAM,CAAC,IAAY,CAAC,OAAgB,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC,oCAAoC,KAAK,IAAI,CAAC,CAAC;QAEtF,MAAM,KAAK,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,kBAAkB,KAAK,MAAM,CAAC,CAAC;QACrE,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3C,IAAI,OAAO,CAAC,YAAY;gBAAE,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;YAC3E,IAAI,OAAO,CAAC,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerSearchVideosTool(server: McpServer): void;
@@ -1,37 +0,0 @@
1
- import { z } from "zod";
2
- import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
3
- export function registerSearchVideosTool(server) {
4
- server.registerTool("formgen_search_videos", {
5
- title: "Search Videos",
6
- description: `Search for royalty-free stock video clips from Pexels and Pixabay. Returns video URLs with duration and resolution info.`,
7
- inputSchema: {
8
- query: z.string().describe("Search query (e.g. 'ocean waves', 'city timelapse')"),
9
- count: z.number().min(1).max(10).default(3).optional()
10
- .describe("Max results per provider (default 3)"),
11
- },
12
- annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
13
- }, async ({ query, count }) => {
14
- const result = await callInternalApi("/internal/formgen/search-videos", {
15
- body: { query, count },
16
- });
17
- if (!result.ok)
18
- return errorResult(result.error);
19
- const results = result.data.results;
20
- if (!results.length)
21
- return textResult(`No videos found for "${query}".`);
22
- const lines = [`Found ${results.length} videos for "${query}":\n`];
23
- for (const vid of results) {
24
- lines.push(`- [${vid.source}] ${vid.title}`);
25
- lines.push(` URL: ${vid.url}`);
26
- if (vid.duration)
27
- lines.push(` Duration: ${vid.duration}s`);
28
- if (vid.width && vid.height)
29
- lines.push(` Resolution: ${vid.width}x${vid.height}`);
30
- if (vid.attribution)
31
- lines.push(` Attribution: ${vid.attribution}`);
32
- lines.push("");
33
- }
34
- return textResult(lines.join("\n"));
35
- });
36
- }
37
- //# sourceMappingURL=search-videos.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-videos.js","sourceRoot":"","sources":["../../src/tools/search-videos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,0HAA0H;QACvI,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YACjF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACnD,QAAQ,CAAC,sCAAsC,CAAC;SACpD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACvG,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,iCAAiC,EAAE;YACtE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAI,MAAM,CAAC,IAAY,CAAC,OAAgB,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC,wBAAwB,KAAK,IAAI,CAAC,CAAC;QAE1E,MAAM,KAAK,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,gBAAgB,KAAK,MAAM,CAAC,CAAC;QACnE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAChC,IAAI,GAAG,CAAC,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC7D,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACpF,IAAI,GAAG,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC"}