ascii-art-mcp
ascii-art-mcp
ascii-art-mcp는 Node.js 및 TypeScript로 구축된 Model Context Protocol (MCP) 서버로, 로컬 데이터베이스에서 ASCII 및 유니코드 아트를 검색하는 도구를 제공합니다.
서버는 stdio 전송을 사용하여 통신하므로 다음과 같은 MCP 클라이언트와 호환됩니다:
Claude Desktop
Cursor
LM Studio
Open WebUI
기타 MCP 호환 환경
https://theduodecim.github.io/ascii-art-mcp/
▶ 이 MCP 실행
MCP 호환 AI 채팅에 이 링크를 넣기만 하면 됩니다:
https://github.com/theduodecim/ascii-art-mcp/tree/main"이 MCP 실행"
AI가 저장소를 복제하고, 빌드하고, 자동으로 실행합니다. 사용자 측에서 설정이 필요 없습니다.
📦 설치
패키지는 npm에서 사용할 수 있습니다:
https://www.npmjs.com/package/ascii-art-mcp
로컬에 설치:
npm install ascii-art-mcp또는 직접 실행:
npx ascii-art-mcp🌐 MCP 레지스트리
이 서버는 공식 Model Context Protocol 레지스트리에도 게시되어 있습니다:
https://registry.modelcontextprotocol.io/?q=ascii-art
서버 이름:
io.github.theduodecim/ascii-art이를 통해 MCP 호환 도구가 자동으로 검색하고 설치할 수 있습니다.
⚙️ 요구 사항
Node.js 20+
npm
🚀 서버 수동 실행
개발 모드:
npm run dev빌드 + 프로덕션 실행:
npm run build
npm start서버는 stdio 전송을 사용하며 다음 위치에서 데이터를 로드합니다:
db.json저장소 루트에 있습니다.
🧰 사용 가능한 MCP 도구
Related MCP server: Ascii Art AI MCP
get_ascii_art
정확한 이름 또는 별칭의 정확한 값으로 아트 항목을 찾습니다.
입력
필드 | 유형 | 필수 |
query | string | 예 |
출력
항목의 art 필드를 일반 텍스트로 반환합니다.
search_ascii
categoria, tags 또는 둘 다로 항목을 검색합니다.
입력
필드 | 유형 | 필수 |
categoria | string | 선택 |
tag | string | 선택 |
최소 하나의 필터가 필요합니다.
출력
일치하는 항목의 art 필드를 텍스트 출력으로 결합하여 반환합니다.
random_ascii
데이터베이스에서 무작위 항목을 반환합니다.
입력
필드 | 유형 | 필수 |
tipo | ascii | unicode | 필수 |
출력
선택한 항목의 art 필드를 일반 텍스트로 반환합니다.
list_categories
데이터베이스에 있는 모든 고유 카테고리를 나열합니다.
입력
없음
출력
카테고리 이름을 줄바꿈으로 구분된 텍스트로 반환합니다.
🗂 데이터 모델
db.json의 항목은 AsciiArtEntry TypeScript 인터페이스를 따릅니다:
src/types/asciiArt.ts각 항목은 다음과 같은 메타데이터를 포함합니다:
name
category
tags
aliases
art content
🧪 MCP 서버 테스트
간단한 통합 테스트를 사용하여 JSON-RPC over stdio를 통한 MCP 통신을 검증했습니다.
예제 테스트 스크립트 (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.jsonTypeScript MCP 서버
JSON 데이터베이스 (
db.json)도구 입력에 대한 Zod 검증
stdio 전송
🎯 목적
이 프로젝트는 다음을 수행하는 간단한 MCP 도구 서버를 구축하는 방법을 보여줍니다:
로컬에서 실행
API 키가 필요 없음
구조화된 도구 노출
MCP를 통해 정적 데이터 제공
📜 라이선스
MIT
Available Tools
4 toolsget_ascii_artA
Search an ASCII/Unicode art entry by nombre or aliases and return the art text.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It reliably conveys a read/search operation and that the art text is returned, but it does not disclose behavior for edge cases such as no match, multiple matches, or case sensitivity. The core behavior is communicated, but not deeply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that uses an active verb and provides both search scope and result. There is no filler or unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter, no nested objects, and a clear text return, the description is largely complete. It states both what is being searched and what is returned. It could mention empty/error behavior, but the simplicity of the tool limits the need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only describes 'query' as a string with minLength 1; it gives no semantic meaning. The description compensates by explaining that the query is matched against 'nombre or aliases', which effectively defines the parameter's purpose. It could add more nuance about matching, but it is sufficient for a single-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'search', the resource 'ASCII/Unicode art entry', and the lookup criteria 'by nombre or aliases'. This makes it distinct from random_ascii and list_categories, though the overlap with sibling search_ascii is not fully clarified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool instead of alternatives. The description implies it is for finding an entry by known name/alias, but it does not mention exclusions or direct the agent to search_ascii for broader text search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesA
List all unique categories available in the database.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description does not explicitly state that the operation is read-only or safe. While 'list' implies no side effects, the absence of any safety or side-effect disclosure leaves some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no extraneous words. It is appropriately sized and front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing operation with no parameters and no output schema, the description fully explains what the tool does. It is complete for the tool's scope, and no additional information appears necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter details to convey. The description does not need to add anything beyond the schema, and nothing is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool lists all unique categories from the database, leaving no ambiguity about its function. The verb 'list' and the object 'all unique categories' provide clear intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not mention when to use this tool versus alternatives like get_ascii_art or search_ascii. It lacks explicit context for choosing this tool over others, though the purpose alone might imply use when category listing is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
random_asciiA
Return a random ASCII/Unicode art entry, optionally filtered by tipo.
| Name | Required | Description | Default |
|---|---|---|---|
| tipo | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral disclosure burden. It only states what it returns, not any side effects (though likely read-only), determinism, or failure modes. It doesn't mention if the result could be empty, or whether the filter restricts the random pool. Minimal behavioral insight beyond the immediate action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence. It packs the core information (random + optional filter) without wasted words. Perfectly sized for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (1 optional param, no output schema, no annotations), the description is minimally complete. It states what it returns and how to filter. However, it lacks context on when to use this vs siblings, and does not indicate if the selection is truly uniform or if there are any edge cases (e.g., empty category). For a straightforward read-only tool, it's adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema defines 'tipo' as an enum (ascii/unicode), so baseline is 3 due to schema coverage. The description adds the meaning that it acts as a filter ('optionally filtered by tipo'), which is useful. However, it doesn't elaborate beyond that—no format details or examples, so it neither fully compensates for the 0% schema description coverage nor adds substantial extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action (return a random art entry) and identifies the resource (ASCII/Unicode art) with an optional filter. It inherently distinguishes from siblings like get_ascii_art (specific retrieval) and search_ascii (filtered search) by emphasizing randomness. The verb 'Return' is explicit and the scope is well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for obtaining a random art entry, but does not explicitly compare to alternatives or state when not to use it. There is no mention of when to prefer this over search_ascii or get_ascii_art. It provides a clear context (random selection) but no exclusions or contrast with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_asciiA
Search entries by categoria or tags and return matching art texts.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| categoria | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It states the action ('search') and outcome ('return matching art texts'), which implies a read-only operation. It does not explicitly mention side effects, but the nature of search suggests no state changes, so it is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no superfluous information. It directly communicates the tool's purpose without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple context and the existence of sibling tools, the description adequately covers the essential information. It does not explain return format or edge cases, but the lack of an output schema makes that less critical. Overall, it provides enough context for a basic understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides no descriptions, but the description mentions 'categoria or tags', giving some meaning to the parameters. However, it does not clarify whether both are optional, how they combine, or acceptable formats, so it adds partial value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool searches entries by categoria or tags and returns matching art texts. It uses a specific verb ('search') and resource ('entries'), and it is distinct from sibling tools like get_ascii_art, random_ascii, and list_categories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for searching, but it does not explicitly contrast with alternatives or explain when this tool should be preferred over others. It lacks guidance on context, such as whether to use it when looking for specific art texts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.1- First observed
get_ascii_art - First observed
list_categories - First observed
random_ascii - First observed
search_ascii
TDQS
Scored across 4 tools
get_ascii_art and search_ascii both return matching art texts, which could cause some confusion, but they are distinguished by query type (name/aliases vs. category/tags). random_ascii and list_categories are clearly distinct.
Three tools follow a clear verb_noun pattern (get_ascii_art, search_ascii, list_categories), and random_ascii is still readable and consistent in snake_case despite lacking a typical verb prefix.
With only 4 tools, the server is tightly scoped to ASCII art retrieval and discovery. Every tool serves a useful purpose and the count feels appropriate for the niche domain.
The server covers the core read-only workflows: finding by name, browsing by category/tag, getting random art, and listing available categories. There are no obvious missing operations for an ASCII art lookup service.
Maintenance
Related MCP Connectors
MCP server for accessing curated awesome list documentation
An MCP server that provides tools to discover and retrieve podcast episodes transcripts.
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
Related MCP Servers
- MIT
- AlicenseNot gradedqualityBmaintenanceAscii Art AI - MCP server providing AI-powered tools and automation by MEOK AI Labs7 npm46 PyPIMIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for querying the MusicBrainz database, providing tools to search for artists, releases, recordings, and browse music metadata.4MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI agents to create beautiful ASCII diagrams using Unicode box-drawing characters, with support for stateful canvas operations, multiple shape types, and style customization.2-