artscii 0.3.1 → 0.3.2
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/banner.d.ts +7 -0
- package/dist/banner.js +14 -0
- package/dist/index.js +20 -0
- package/dist/mcp.js +8 -0
- package/package.json +3 -1
package/dist/banner.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const BANNER_FONTS: readonly ["Standard", "Small", "Slant", "Big", "Mini"];
|
|
2
|
+
export type BannerFont = (typeof BANNER_FONTS)[number];
|
|
3
|
+
export declare function renderBanner(text: string, font?: BannerFont): string;
|
|
4
|
+
export declare function listBannerFonts(): {
|
|
5
|
+
name: BannerFont;
|
|
6
|
+
description: string;
|
|
7
|
+
}[];
|
package/dist/banner.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import figlet from 'figlet';
|
|
2
|
+
export const BANNER_FONTS = ['Standard', 'Small', 'Slant', 'Big', 'Mini'];
|
|
3
|
+
export function renderBanner(text, font = 'Standard') {
|
|
4
|
+
return figlet.textSync(text, { font });
|
|
5
|
+
}
|
|
6
|
+
export function listBannerFonts() {
|
|
7
|
+
return [
|
|
8
|
+
{ name: 'Standard', description: 'Default balanced font' },
|
|
9
|
+
{ name: 'Small', description: 'Compact, saves tokens' },
|
|
10
|
+
{ name: 'Slant', description: 'Italic style' },
|
|
11
|
+
{ name: 'Big', description: 'Bold emphasis' },
|
|
12
|
+
{ name: 'Mini', description: 'Minimal 3-line font' },
|
|
13
|
+
];
|
|
14
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { MAX_NAME_LENGTH, MAX_TAG_LENGTH, MAX_TAGS, MAX_DESCRIPTION_LENGTH, CONV
|
|
|
7
7
|
import { resolveImageInput, ConvertInputError } from './resolve.js';
|
|
8
8
|
import { convertImage } from './converter.js';
|
|
9
9
|
import { createRateLimiter } from './rate-limit.js';
|
|
10
|
+
import { renderBanner, listBannerFonts, BANNER_FONTS } from './banner.js';
|
|
10
11
|
const app = new Hono();
|
|
11
12
|
app.use('*', cors());
|
|
12
13
|
const checkRateLimit = createRateLimiter(RATE_LIMIT_PER_MIN);
|
|
@@ -26,6 +27,8 @@ app.get('/', (c) => c.json({
|
|
|
26
27
|
category: 'GET /categories/:name',
|
|
27
28
|
list: 'GET /list',
|
|
28
29
|
convert: 'POST /convert { url?, base64?, size?, invert?, contrast?, gamma?, save? }',
|
|
30
|
+
banner: 'GET /banner?text={text}&font=Standard|Small|Slant|Big|Mini',
|
|
31
|
+
bannerFonts: 'GET /banner/fonts',
|
|
29
32
|
kaomoji: 'GET /kaomoji?q={query}',
|
|
30
33
|
kaomojiRandom: 'GET /kaomoji/random',
|
|
31
34
|
kaomojiCategories: 'GET /kaomoji/categories',
|
|
@@ -144,6 +147,23 @@ app.delete('/art/:id', async (c) => {
|
|
|
144
147
|
return c.json({ error: e.message ?? 'Unknown error' }, (e.status ?? 500));
|
|
145
148
|
}
|
|
146
149
|
});
|
|
150
|
+
// --- Banner endpoints ---
|
|
151
|
+
app.get('/banner', (c) => {
|
|
152
|
+
const text = c.req.query('text');
|
|
153
|
+
if (!text)
|
|
154
|
+
return c.json({ error: 'query parameter "text" is required' }, 400);
|
|
155
|
+
if (text.length > 50)
|
|
156
|
+
return c.json({ error: '"text" must be 50 chars or less' }, 400);
|
|
157
|
+
const fontParam = c.req.query('font') ?? 'Standard';
|
|
158
|
+
if (!BANNER_FONTS.includes(fontParam)) {
|
|
159
|
+
return c.json({ error: `Invalid font. Available: ${BANNER_FONTS.join(', ')}` }, 400);
|
|
160
|
+
}
|
|
161
|
+
const banner = renderBanner(text, fontParam);
|
|
162
|
+
return c.text(banner);
|
|
163
|
+
});
|
|
164
|
+
app.get('/banner/fonts', (c) => {
|
|
165
|
+
return c.json(listBannerFonts());
|
|
166
|
+
});
|
|
147
167
|
// --- Kaomoji endpoints ---
|
|
148
168
|
app.get('/kaomoji', (c) => {
|
|
149
169
|
const q = c.req.query('q');
|
package/dist/mcp.js
CHANGED
|
@@ -7,6 +7,7 @@ import { loadKaomoji, searchKaomoji, getRandomKaomoji, listKaomojiCategories, ge
|
|
|
7
7
|
import { MAX_NAME_LENGTH, MAX_TAG_LENGTH, MAX_TAGS, MAX_DESCRIPTION_LENGTH, SIZE_LIMITS, DEFAULT_SIZE } from './constants.js';
|
|
8
8
|
import { resolveImageInput } from './resolve.js';
|
|
9
9
|
import { convertImage } from './converter.js';
|
|
10
|
+
import { renderBanner, BANNER_FONTS } from './banner.js';
|
|
10
11
|
const server = new McpServer({
|
|
11
12
|
name: 'artscii',
|
|
12
13
|
version: '0.3.0',
|
|
@@ -61,6 +62,13 @@ server.tool('categories', 'List all categories.', {}, async () => {
|
|
|
61
62
|
const cats = listCategories();
|
|
62
63
|
return { content: [{ type: 'text', text: cats.join(', ') }] };
|
|
63
64
|
});
|
|
65
|
+
server.tool('banner', 'Render text as a large ASCII banner using FIGlet fonts. Great for CLI headers, welcome messages, and titles.', {
|
|
66
|
+
text: z.string().max(50).describe('Text to render (max 50 chars)'),
|
|
67
|
+
font: z.enum(BANNER_FONTS).default('Standard').describe('Font: Standard (default), Small (compact), Slant (italic), Big (bold), Mini (minimal)'),
|
|
68
|
+
}, async ({ text, font }) => {
|
|
69
|
+
const banner = renderBanner(text, font);
|
|
70
|
+
return { content: [{ type: 'text', text: banner }] };
|
|
71
|
+
});
|
|
64
72
|
server.tool('kaomoji', 'Get a kaomoji (Japanese text emoticon) by emotion or keyword. Perfect for inline text expressions.', {
|
|
65
73
|
query: z.string().optional().describe('Emotion or keyword (e.g. "happy", "sad", "cat", "shrug"). Omit for random.'),
|
|
66
74
|
category: z.string().optional().describe('Filter by category (e.g. "happy", "animals", "table-flip")'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "artscii",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "ASCII art & kaomoji search MCP server for AI agents",
|
|
5
5
|
"mcpName": "io.github.rxolve/artscii",
|
|
6
6
|
"type": "module",
|
|
@@ -39,11 +39,13 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@hono/node-server": "^1.19.12",
|
|
41
41
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
42
|
+
"figlet": "^1.11.0",
|
|
42
43
|
"hono": "^4.12.9",
|
|
43
44
|
"sharp": "^0.34.5",
|
|
44
45
|
"zod": "^4.3.6"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
48
|
+
"@types/figlet": "^1.7.0",
|
|
47
49
|
"@types/node": "^25.5.0",
|
|
48
50
|
"tsx": "^4.21.0",
|
|
49
51
|
"typescript": "^6.0.2"
|