ASCII Banner MCP Server
This MCP server generates ASCII art banners from text strings using various pyfiglet fonts.
List available fonts (
get_fonts): Retrieve a complete list of all available pyfiglet font names (e.g.,'slant','standard','block','bubble','big') to discover options before generating banners.Generate ASCII art banners (
generate_banner): Convert any text string into a multi-line ASCII art banner, with an optional font name (defaults to'standard').
ASCII Banner MCP Server
A classical Model Context Protocol (MCP) server that generates ASCII art banners from any string using pyfiglet.
Features
get_fonts— List all available pyfiglet font names (viaFigletFont.getFonts()).generate_banner— Render a string as ASCII art with a chosen font (viafiglet_format(text, font=...)).
Related MCP server: whereami-mcp
Requirements
Python ≥ 3.10
mcp,pyfiglet
Installation
From the project root:
pip install -e .For development (tests):
pip install -e ".[dev]"Usage
Run the server (stdio)
MCP clients typically run the server as a subprocess and talk over stdio:
python -m ascii_banner_mcp.serverOr after install:
ascii-banner-mcpConfig example
Copy and adjust one of the examples in config/:
stdio (local):
config/mcp-config.example.json—command+argsfor Cursor, Claude Desktop, etc.streamable-http (e.g. Docker):
config/mcp-config-streamable-http.example.json—url: "http://localhost:8000/mcp"when the server runs over HTTP.
Configure your MCP client
Add the server to your MCP client config (e.g. Cursor, Claude Desktop). Example (stdio):
{
"mcpServers": {
"ascii-banner": {
"command": "python",
"args": ["-m", "ascii_banner_mcp.server"]
}
}
}If you use a virtualenv, use the full path to that Python:
{
"mcpServers": {
"ascii-banner": {
"command": "/path/to/venv/bin/python",
"args": ["-m", "ascii_banner_mcp.server"]
}
}
}Tools
Tool | Description |
| Returns a list of available font names. Use this to discover fonts for |
| Renders |
Example (equivalent to your snippet):
from pyfiglet import figlet_format
print(figlet_format("Hello", font="slant"))Via this MCP server: call generate_banner with text="Hello" and font="slant".
MCP Inspector
Use MCP Inspector to test and debug the server.
Option 1 — stdio (local process)
Run the Inspector:
npx @modelcontextprotocol/inspectorIn the UI, add a server with Stdio transport.
Set Command to
python(or full path to your Python/venv).Set Args to
-m,ascii_banner_mcp.server.Ensure the project is installed (
pip install -e .) or set cwd to the project root and usepython -m ascii_banner_mcp.server.
Option 2 — streamable-http (Docker or local)
Start the server over HTTP:
Docker:
docker compose -f .docker/docker-compose.yml up --build(see Docker below).Local:
MCP_TRANSPORT=streamable-http python -m ascii_banner_mcp.server(serves athttp://127.0.0.1:8000/mcp).
Run the Inspector:
npx @modelcontextprotocol/inspectorAdd a server with Streamable HTTP (or URL) and set the URL to
http://localhost:8000/mcp.
Custom ports (Inspector):
CLIENT_PORT=8080 SERVER_PORT=9000 npx @modelcontextprotocol/inspector
Docker
Run the MCP server in a container. Use the .docker/ setup:
stdio (default) — client runs the container and talks via stdin/stdout:
docker build -f .docker/Dockerfile -t ascii-banner-mcp .
docker run -i --rm ascii-banner-mcpstreamable-http (for Inspector or URL-based clients):
docker compose -f .docker/docker-compose.yml up --buildServer is at http://localhost:8000/mcp. Use config/mcp-config-streamable-http.example.json or point MCP Inspector at that URL.
Development
Tests:
pytestLint:
ruff check src testsFormat:
black src testsPre-commit: Black, Ruff, and conventional-commit message checks (e.g.
feat:,fix:). Install:pip install -e ".[dev]"thenpre-commit installandpre-commit install --hook-type commit-msg. Run manually:pre-commit run --all-files.
License
MIT
Available Tools
2 toolsgenerate_bannerA
Generate an ASCII art banner from the given string.
Args:
text: The string to render as ASCII art (e.g. "Hello", "MCP").
font: Name of the pyfiglet font. Use get_fonts() to list available fonts.
Default is "standard". Common options: "slant", "block", "bubble", "big".
Returns:
The ASCII art banner as a multi-line string.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| font | No | standard |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It describes the core behavior (generating ASCII art) and mentions the return format, but doesn't cover potential limitations like text length constraints, error conditions, or performance characteristics that would be helpful for an agent.
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 well-structured with clear sections (Args, Returns), uses bullet-like formatting for font options, and every sentence adds value. It's appropriately sized for a 2-parameter tool with good information density.
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 moderate complexity, no annotations, and the presence of an output schema (which handles return values), the description is mostly complete. It covers purpose, parameters, and basic usage, though could benefit from more behavioral context about limitations or edge cases.
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 description adds significant value beyond the input schema, which has 0% description coverage. It explains what 'text' represents with examples, describes the 'font' parameter with default value, common options, and how to discover available fonts using get_fonts(). This fully compensates for the schema's lack of descriptions.
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 purpose: 'Generate an ASCII art banner from the given string.' It specifies the verb ('Generate'), resource ('ASCII art banner'), and distinguishes from its sibling get_fonts by focusing on banner creation rather than font listing.
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 provides clear context for usage by mentioning the sibling tool get_fonts() to list available fonts, which helps guide when to use this tool. However, it doesn't explicitly state when not to use it or mention alternatives beyond the font listing reference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fontsA
List all available pyfiglet font names.
Returns a list of font identifiers that can be used with generate_banner.
Use this to discover which fonts (e.g. 'slant', 'standard', 'block') are available.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the return type ('Returns a list of font identifiers') and the tool's purpose for discovery, which is adequate behavioral context for a read-only list operation. However, it doesn't mention potential limitations like rate limits or error conditions.
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?
Three sentences that are front-loaded with the core purpose, followed by usage guidance and examples. Every sentence earns its place with no wasted words, making it highly efficient and well-structured.
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 simplicity (0 parameters, no annotations, but has an output schema), the description is complete. It explains what the tool does, how to use it, and references the output format, which is sufficient since the output schema will detail the return values.
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 0 parameters with 100% schema description coverage, so the baseline is 4. The description appropriately doesn't discuss parameters, focusing instead on the tool's purpose and output, which adds value beyond the empty 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 the specific verb ('List') and resource ('all available pyfiglet font names'), and distinguishes from its sibling tool generate_banner by explaining the relationship. It provides concrete examples of font identifiers like 'slant', 'standard', 'block'.
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?
Explicitly states when to use this tool ('Use this to discover which fonts... are available') and provides a clear alternative ('that can be used with generate_banner'), giving complete guidance on tool selection versus its sibling.
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.
2 tool updates
v1.0.0- First observed
generate_banner - First observed
get_fonts
TDQS
Scored across 2 tools
The two tools have perfectly distinct purposes: generate_banner creates ASCII art from text, while get_fonts lists available fonts. There is no overlap or ambiguity between them; an agent can easily tell them apart based on their clear, complementary functions.
Both tools follow a consistent verb_noun pattern: generate_banner and get_fonts. The naming is predictable and readable, with no deviations or mixed conventions, making it easy for an agent to understand and use them.
With only 2 tools, this server feels thin for its apparent scope of ASCII banner generation. While the tools cover core functionality, the count is too low for a typical server, limiting flexibility and potentially requiring agents to work around missing operations like customization or management features.
The server covers basic ASCII banner generation with text input and font selection, but there are notable gaps. For example, it lacks tools for customizing banners (e.g., adjusting width, alignment, or colors) or managing generated banners, which could hinder more advanced agent workflows in this domain.
Maintenance
Related MCP Connectors
A simple MCP server built with FastMCP and python
An MCP server that provides asset auto generator
Related MCP Servers
- MIT
- AlicenseNot gradedqualityDmaintenanceA lightweight mcp server that tells you exactly where you are.4MIT
- AlicenseAqualityDmaintenanceA lightweight MCP server that tells you exactly who you are.11MIT
- FlicenseAqualityDmaintenanceA simple MCP server that provides greeting tools and server information.1-