A local ASCII and Unicode art database that runs over stdio and requires no API keys. It exposes four tools: get_ascii_art for exact name lookups, search_ascii for filtering by category or tags, random_ascii for pulling a random entry by type, and list_categories for browsing what's available. The art lives in a local db.json file that ships with the server. Reach for this when you want to inject ASCII art into responses without maintaining your own collection or hitting external APIs. Built in TypeScript, runs on Node 20+, and works with Claude Desktop, Cursor, and other MCP clients.
ascii-art-mcp is a Model Context Protocol (MCP) server built with Node.js and TypeScript that exposes tools for retrieving ASCII and Unicode art from a local database.
The server communicates using stdio transport, making it compatible with MCP clients such as:
Just drop this link into any MCP-compatible AI chat:
https://github.com/theduodecim/ascii-art-mcp/tree/main
"Run this MCP"
The AI will clone the repo, build it, and run it automatically. No setup needed on your end.
The package is available on npm:
https://www.npmjs.com/package/ascii-art-mcp
Install locally:
npm install ascii-art-mcp
Or run directly:
npx ascii-art-mcp
This server is also published in the official Model Context Protocol Registry:
https://registry.modelcontextprotocol.io/?q=ascii-art
Server name:
io.github.theduodecim/ascii-art
This allows MCP-compatible tools to discover and install it automatically.
Development mode:
npm run dev
Build + production run:
npm run build
npm start
The server uses stdio transport and loads its data from:
db.json
located in the repository root.
Finds an art entry by exact nombre or by an exact value in aliases.
| Field | Type | Required |
|---|---|---|
| query | string | yes |
Returns the entry's art field as plain text.
Searches entries by categoria, tags, or both.
| Field | Type | Required |
|---|---|---|
| categoria | string | optional |
| tag | string | optional |
At least one filter is required.
Returns matching entries' art fields combined as text output.
Returns a random entry from the database.
| Field | Type | Required |
|---|---|---|
| tipo | ascii | unicode | required |
Returns the selected entry's art field as plain text.
Lists all unique categories present in the database.
None
Category names as newline-separated text.
Entries in db.json follow the AsciiArtEntry TypeScript interface:
src/types/asciiArt.ts
Each entry contains metadata such as:
A simple integration test was used to verify MCP communication using JSON-RPC over stdio.
Example test script (test.mjs):
import { spawn } from "child_process";
const proc = spawn("node", ["dist/server.js"], {
stdio: ["pipe", "pipe", "pipe"]
});
proc.stderr.on("data", (d) => {
console.log("LOG:", d.toString());
});
proc.stdout.on("data", (d) => {
console.log("SERVER:", d.toString());
});
function send(msg) {
const json = JSON.stringify(msg);
const payload = `Content-Length: ${Buffer.byteLength(json)}\r\n\r\n${json}\r\n`;
console.log("\nSENDING:\n", json, "\n");
proc.stdin.write(payload);
}
setTimeout(() => {
send({
jsonrpc: "2.0",
id: 1,
method: "initialize",
params: {
protocolVersion: "2024-11-05",
capabilities: {},
clientInfo: {
name: "tester",
version: "1.0"
}
}
});
}, 500);
setTimeout(() => {
send({
jsonrpc: "2.0",
method: "initialized",
params: {}
});
}, 1000);
setTimeout(() => {
send({
jsonrpc: "2.0",
id: 2,
method: "tools/list"
});
}, 1500);
setTimeout(() => {
proc.kill();
console.log("TEST FINISHED");
}, 4000);
src/
server.ts
tools/
types/
dist/
db.json
db.json)This project demonstrates how to build a simple MCP tool server that:
MIT