ASCII Table MCP Server
This server generates beautifully formatted ASCII/Unicode tables with full support for Thai, Pali, CJK, emoji, and other complex scripts — and exports them as text, PNG, or SVG.
Create tables from raw headers/rows, CSV/TSV, or JSON data, with 9 output formats (grid, box, pipe, safe, html, png, svg) and 10+ grid sub-styles (mysql, gfm, reddit, rounded, unicode, dots, etc.). Auto-formats numeric columns (right-align) and centers headers automatically.
Export as images: Render polished PNG images via headless Playwright (ideal for Discord, Telegram, Slack) or scalable SVG vector graphics with embedded HTML and Noto Sans Thai font.
Handle complex scripts correctly using wcwidth for display width, properly handling zero-width combining marks (Thai tone marks, Devanagari, etc.). Enable safe_width mode for platforms like Discord or browser code blocks that miscount zero-width characters.
Debug and validate tables:
analyze_table— inspect column positions withwcwidth-aware widths to validate alignment.validate_table_text— check structural integrity (border/data alternation, column count stability, marker consistency).debug_table— generate a detailed diagnostic report with exact character positions and drift analysis for troubleshooting misaligned Unicode content.
Preview styles with sample Thai/Pali or English data using make_table_preview.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ASCII Table MCP Servercreate a box table with headers: คำบาลี, Roman; rows: กมฺม, kamma; อวิชฺชา, avijjā"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ASCII Table MCP Server
Beautiful tables in terminal code blocks AND as polished images — with native Thai, Pali, Roman, CJK, and emoji support.
+------------+------------------+--------+----------------------+
| Pali | Roman | Type | Meaning |
+------------+------------------+--------+----------------------+
| ปฏิจจสมุปฺปาท | paṭiccasamuppāda | Dhamma | Dependent origination |
| กามจฺฉนฺท | kāmacchanda | Nīvaraṇa | Sensual desire |
| อวิชฺชา | avijjā | Kilesa | Ignorance |
+------------+------------------+--------+----------------------+Thai + Roman + numbers → pixel-perfect alignment, every row.
🌐 Try it in your browser! → ASCII Table → Image Generator Paste CSV, pick a style, export as PNG / SVG / Grid / Box / Pipe. Thai + emoji ready. No install needed.

Why this exists: Most ASCII table libraries use len() in Python, which counts combining marks (like Thai tone marks, Devanagari vowel signs) as separate characters. This breaks alignment for any language with zero-width characters. This server uses wcwidth — the same library terminals use — so columns line up correctly, on every platform.
Features
9 table formats:
grid(+--+),box(┌─┬─┐),pipe(| | |),safe,html,png,svg+ more10 grid sub-styles:
mysql,separated,compact,gfm,reddit,rounded,rst,box,unicode,dots— inspired by ozh/ascii-tablesAuto-format: auto-detects numeric columns (right-align) and centers headers
Thai / Pali / CJK / emoji: zero-width combining marks (ิ, ี, ฺ, ◌̱, etc.) align perfectly
Safe width mode: extra padding for platforms where zero-width marks ≠ zero (Discord, browser code blocks)
Direct PNG export: headless Playwright renders styled HTML → cropped PNG with Noto Sans Thai — perfect for Discord/Telegram
Direct SVG export: vector SVG with embedded HTML (foreignObject) — zoomable, embeddable
4 polished HTML styles:
dark,light,minimal,compactCSV / TSV / JSON input: convert from any data source
Debug tools:
analyze_table,debug_table,validate_table_text— find and fix alignment issues
Related MCP server: mcp-markdown-tools
Direct PNG Export — One Step to a Gorgeous Table Image
For Discord, Telegram, Slack, or any place that can't render a proper monospace Thai table, use export_png to generate a cropped PNG directly — no browser, no manual screenshot, no crop step.
Style | Preview | Best for |
|
| Discord / Telegram dark mode |
|
| Documentation, PDF |
|
| Blog posts, websites |
|
| Dense data, narrow screens |
{
"headers": ["Pali", "Roman", "Type", "Meaning"],
"rows": [
["กมฺม", "kamma", "Noun", "action"],
["ญาณ", "ñāṇa", "Wisdom", "direct knowing"]
],
"style": "dark"
}Output: a .png file cropped to just the table — send it with MEDIA:<path> in Discord/Telegram.
Direct SVG Export — Vector That Scales
Use export_svg for images that need to be zoomed, embedded, or edited.
{
"headers": ["Term", "Translation"],
"rows": [["กมฺม", "Kamma"], ["ธมฺม", "Dhamma"]],
"style": "dark"
}SVG is HTML-backed (foreignObject) with Noto Sans Thai — renders sharp at any size.
Supported Formats
Quick Start
uvx (no install)
uvx --from git+https://github.com/dhammawatthumpra-coder/ascii-table-mcp ascii-table-mcppip install
git clone https://github.com/dhammawatthumpra-coder/ascii-table-mcp.git
cd ascii-table-mcp
pip install -e .
python -m ascii_table_mcpRegister with any MCP client
Claude Desktop:
{
"mcpServers": {
"ascii-table": {
"command": "python",
"args": ["-m", "ascii_table_mcp"]
}
}
}Hermes:
hermes mcp add ascii-table --command "python -m ascii_table_mcp"MCP Tools
make_table — The main event
Parameter | Type | Default | Description |
|
| — | Column headers |
|
| — | Data rows |
|
|
|
|
|
|
| One of 10 grid styles or 4 HTML styles |
|
|
| Right-align numbers, center headers |
|
|
| Extra padding for Discord/browser |
Example with style="separated":
{
"headers": ["Product", "Price", "Qty"],
"rows": [
["Noodle Soup", "45", "3"],
["Fried Rice", "55", "2"]
],
"fmt": "grid",
"style": "separated"
}+============+======+=======+
| Product | Price | Qty |
+============+======+=======+
+------------+------+-------+
| Noodle Soup | 45 | 3 |
+------------+------+-------+
| Fried Rice | 55 | 2 |
+------------+------+-------+Notice: auto_format=true right-aligns Price and Qty columns, centers headers.
make_table_from_csv
{
"csv_text": "Name,Role,Score\nAlice,Admin,95\nBob,User,87",
"fmt": "grid"
}make_table_from_json
{
"json_data": "[[\"Term\",\"Meaning\"],[\"Kamma\",\"Action\"],[\"Dhamma\",\"Truth\"]]",
"fmt": "box"
}export_png — Direct PNG export
Render table as cropped PNG via headless Playwright.
Parameter | Type | Default | Description |
|
| — | Column headers |
|
| — | Data rows |
|
|
|
|
|
|
| Font size in px |
{
"headers": ["คำบาลี", "Roman"],
"rows": [["กมฺม", "kamma"], ["ธมฺม", "dhamma"]],
"style": "dark"
}→ Returns file path to cropped PNG. Send with MEDIA:<path>.
export_svg — Direct SVG export
Render table as vector SVG (foreignObject with styled HTML).
Same parameters as export_png. Returns file path to .svg.
Debug tools
debug_table— shows exact char positions with drift analysisanalyze_table— validates column alignment in+--+tablesvalidate_table_text— structural check: column count, border alternation, format detection
Thai Character Width: The Problem This Solves
Discord, browser code blocks, and some terminals don't respect Unicode zero-width combining marks.
Characters like ิ ี ื ู ฺ each take up width=1 on screen, but wcwidth says they're width=0.
len("ก๋วยเตี๋ยว") → 10 ← Python counts combining marks
wcwidth("ก๋วยเตี๋ยว") → 7 ← Reality: only 7 visible column positionsSolution: safe_width=True
When enabled, the renderer uses len() (counts every character as width 1) instead of wcwidth, then adds padding for each combining mark:
{
"headers": ["Name", "Price"],
"rows": [["ก๋วยเตี๋ยว", "45"]],
"fmt": "grid",
"safe_width": true
}+----------------+------+
| Name | Price |
+----------------+------+
| ก๋วยเตี๋ยว | 45 |
+----------------+------+Without safe_width (discord will misalign):
+------------+------+
| Name | Price |
+------------+------+
| ก๋วยเตี๋ยว | 45 | ← column drifts right by 3 chars
+------------+------+Future: Per-Character Width Database
wcwidth and len() are both approximations. A future plan is to build a lookup table of actual display widths for each Thai character on major platforms (Windows Discord, macOS Discord, Linux terminal) for 100% guaranteed alignment.
Grid Styles Reference
Style | Top border | Header sep | Data sep | Bottom | Notes |
|
|
|
|
| default |
|
|
|
|
| bold header separator |
| none |
| none | none | frameless |
| none |
| none | none | GitHub Flavored Markdown |
| none |
| none | none | Reddit tables |
|
|
| none |
| rounded corners |
|
|
|
|
| reStructuredText |
|
|
|
|
| Unicode box-drawing |
|
|
|
|
| double-line |
|
|
| none |
| no row separators |
Format comparison
Format | Example | Best for |
|
| Terminal, code review, GitHub |
|
| Presentation, formal docs |
|
| Markdown-native |
|
| Discord, browser (zero-width ≠ 0) |
|
| Direct export — Discord/Telegram/chat apps |
|
| Vector — zoomable, embeddable |
CLI Usage
# CSV args → grid
python -m ascii_table_mcp.generate_table --grid 'Name,Age' 'Alice,30' 'Bob,25'
# TSV pipe → grid
printf 'Name\tAge\nAlice\t30\n' | python -m ascii_table_mcp.generate_table --tsv --grid
# JSON
python -m ascii_table_mcp.generate_table --json '{"headers":["A","B"],"rows":[["1","2"]]}' --grid+-------+-----+
| Name | Age |
+-------+-----+
| Alice | 30 |
| Bob | 25 |
+-------+-----+Architecture
ascii-table-mcp/
├── ascii_table_mcp/
│ ├── __init__.py # MCP server entry (FastMCP) — 9 tools
│ ├── generate_table.py # Core rendering engine + HTML + PNG + SVG
│ └── thaiwidth.py # Thai-aware display width
├── server.py # Thin CLI wrapper
├── table_to_image.py # HTML → screenshot helper (legacy)
├── table_screenshot.py # HTML generator (legacy)
├── requirements.txt # mcp + wcwidth
├── pyproject.toml # uv/pip packaging
├── ascii-table-mcp.bat # Windows launcher
├── LICENSE # MIT
├── README.md # This file (English)
├── README_TH.md # Thai documentation
├── GUIDE_TH.md # Thai user guide
├── GUIDE_EN.md # English user guide
└── examples/
├── ex_dark.png
├── ex_light.png
├── ex_minimal.png
└── ex_compact.pngWhy wcwidth Instead of len()?
len("กมฺม") → 4 ❌ (counts the dot-below as a character)
wcswidth("กมฺม") → 3 ✅ (dot-below is zero-width)Using len() for table layout:
+----------+-----------+ ← border width 8
| Pali | Roman | ← "กมฺม" = 4 chars → padding 4 → total 9 ❌
+----------+-----------+Using wcwidth:
+---------+-----------+
| Pali | Roman | ← "กมฺม" = width 3 → padding 5 → total 8 ✅
+---------+-----------+Related Projects
ozh/ascii-tables — original table style system
dmarsters/ascii-art-mcp — decorative ASCII art
schachmat/wego — Go terminal weather (go-runewidth)
wcwidth — Python wcwidth implementation
License
MIT — free for personal and commercial use.
Available Tools
7 toolsanalyze_tableA
Analyze column positions in a grid table (+---+).
Uses display-width space (via wcwidth) for position comparison, so Thai/Pali combining marks (พิทุ, สระบน/ล่าง) are handled correctly.
Scans '+' markers in border lines to define column boundaries, then validates '|' alignment in data rows.
Args: table_text: A +---+ grid table as raw text
Returns: Analysis report: column positions, alignment validation, parsed cells
| Name | Required | Description | Default |
|---|---|---|---|
| table_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes key behaviors: uses wcwidth for display-width, handles Thai/Pali combining marks, scans '+' markers, validates '|' alignment, and returns an analysis report. No annotations provided, so description carries full burden; it is detailed but could be more explicit about being read-only.
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?
Description is structured into paragraphs with args/returns and key implementation details. Each sentence adds value, though it could be slightly more streamlined without losing clarity.
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 simplicity of the tool (single parameter, clear output), the description covers input, behavior, and output adequately. It explains Unicode handling and return structure, though error cases are not mentioned.
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 only parameter 'table_text' is explained as 'A +---+ grid table as raw text', adding meaning beyond the schema's type string. The description compensates for 0% schema coverage effectively.
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?
Description clearly states the tool analyzes column positions in a grid table, with specific details like scanning '+' markers and validating '|' alignment. It distinguishes itself from sibling tools by focusing on analysis rather than table creation or preview.
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?
No explicit guidance on when to use this tool versus alternatives like 'validate_table_text' or 'debug_table'. The description implies usage for analyzing grid table formatting but does not provide exclusions or contrasts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_tableC
Render and diagnose a table — shows exact character positions.
Produces a detailed report: plain table, annotated position analysis, and drift comparison between border markers and data pipes.
Args: headers: Optional column headers rows: Data rows data: Alias for rows
Returns: Diagnostic report with position annotations
| Name | Required | Description | Default |
|---|---|---|---|
| headers | No | ||
| rows | No | ||
| data | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It describes output but does not disclose side effects, read-only behavior, or any constraints. For a diagnostic tool, it likely is read-only, but this is not explicitly stated.
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 concise and front-loaded with the purpose. It uses a brief structure with a summary line followed by args and returns. Every sentence contributes, though it could be slightly more organized.
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 has 3 optional parameters and an output schema (not shown), the description covers the basic behavior and return type. However, it lacks details about input-output relationships, error cases, or differentiation from sibling tools.
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?
Schema description coverage is 0%, so the description must compensate. It only repeats parameter names and basic types: headers (optional column headers), rows (data rows), data (alias for rows). This adds minimal value beyond the schema, lacking format constraints or usage details.
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 renders and diagnoses a table, showing exact character positions. It lists output components (plain table, annotated positions, drift comparison). However, it does not explicitly distinguish from sibling tools like analyze_table or make_table, so it is clear but lacks differentiation.
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?
No guidance is provided on when to use this tool versus alternatives. There is no mention of use cases, prerequisites, or situations where other tools would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_tableA
Render data as a table.
Args: headers: Optional list of column header strings rows: List of data rows, each a list of strings data: Alias for rows -- pass data here if you prefer (cannot use both) fmt: "grid" (default) for ASCII grid, "box" for Unicode box-drawing, "pipe" for Markdown pipe table, "safe" for char-count padding style: Table style (for grid fmt). One of: mysql, separated, compact, gfm, reddit, rounded, rst, box, unicode, dots auto_format: Auto-detect numeric columns (right-align) and center headers safe_width: Count zero-width combining marks as width 1 (for Discord/browsers)
Returns: Formatted table as a Markdown code block (grid/box/safe) or raw pipe table.
| Name | Required | Description | Default |
|---|---|---|---|
| headers | No | ||
| rows | No | ||
| data | No | ||
| fmt | No | grid | |
| style | No | mysql | |
| auto_format | No | ||
| safe_width | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden. It explains the return format (Markdown code block or raw pipe table) and notes that rows and data are mutually exclusive. However, it does not disclose error behavior (e.g., for invalid rows) or side effects. It is adequate but not exhaustive.
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 a clear purpose statement followed by a bulleted Args list. It is slightly lengthy but front-loads the key action. Some redundancy (e.g., 'data' alias explanation) could be trimmed for conciseness.
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 7 parameters, no annotations, and an output schema, the description is thorough. It explains the output format, parameter interactions (e.g., mutual exclusivity), and formatting options. The agent can confidently invoke the tool correctly.
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?
Schema coverage is 0%, so the description fully compensates. It details all 7 parameters, including fmt options (grid, box, pipe, safe), style variants, and the auto_format/safe_width flags. This provides significant added meaning beyond the raw 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 'Render data as a table,' which identifies the tool's core function. However, it does not explicitly contrast with siblings like make_table_from_csv or make_table_from_json, which accept different input formats. This slightly reduces differentiation.
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 lacks explicit guidance on when to use this tool versus its siblings. It does not mention that this tool is for rendering raw arrays, while siblings handle CSV/JSON input. The agent must infer usage from parameter types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_table_from_csvA
Parse a CSV/TSV string and render as a table.
Args: csv_text: Raw CSV-formatted text delimiter: Field delimiter (default: comma). Use '\t' for TSV. has_header: If True (default), first row is treated as column headers fmt: "grid" (default), "box", "safe", or "pipe" style: Table style (for grid fmt) auto_format: Auto-detect numeric columns
Returns: Formatted table.
| Name | Required | Description | Default |
|---|---|---|---|
| csv_text | Yes | ||
| delimiter | No | , | |
| has_header | No | ||
| fmt | No | grid | |
| style | No | mysql | |
| auto_format | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes the transformation (parse and render) and return value, but could more explicitly state that the tool is read-only or has no side effects. However, given the tool's nature, this is adequate.
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 concise docstring with a one-sentence summary followed by parameter details. Every sentence is necessary, and the structure front-loads the core purpose.
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?
With 6 parameters (1 required) and an output schema present, the description covers all parameters and states the return value ('Formatted table'), making it complete for an agent to use.
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?
Schema coverage is 0%, but the description includes an Args section that explains every parameter (csv_text, delimiter, has_header, fmt, style, auto_format) with defaults and meaning, adding full 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 'Parse a CSV/TSV string and render as a table' uses a specific verb ('parse', 'render') and resource ('CSV/TSV string', 'table'), clearly distinguishing it from siblings like 'make_table_from_json' and 'make_table'.
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 with CSV/TSV strings but does not explicitly state when to use this tool versus alternatives (e.g., 'make_table_from_json') or provide 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_table_from_jsonA
Parse a JSON array and render as a table.
Accepts either:
A 2D array: [["Name", "Value"], ["alpha", "1"], ...]
An object with "headers" and "rows" keys: {"headers":["Name"], "rows":[["alpha"]]}
Args: json_data: JSON string has_header: If True (default), first row is treated as column headers fmt: "grid" (default), "box", "safe", or "pipe" style: Table style (for grid fmt) auto_format: Auto-detect numeric columns
Returns: Formatted table.
| Name | Required | Description | Default |
|---|---|---|---|
| json_data | Yes | ||
| has_header | No | ||
| fmt | No | grid | |
| style | No | mysql | |
| auto_format | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Mentions auto-format feature and returns 'Formatted table' but lacks details on error handling, performance, or side effects.
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?
Description is well-structured with a clear main purpose, examples, and parameter list. Slightly verbose but still efficient.
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?
Covers input formats, parameters, and return value. Lacks error handling details, but overall sufficient given 5 parameters and no annotations.
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?
Schema coverage is 0%, but description explains each parameter's purpose with examples (e.g., json_data, has_header, fmt, style, auto_format), adding significant meaning beyond the schema names.
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?
Explicitly states it parses a JSON array and renders as a table, distinguishing it from sibling tools that handle CSV (make_table_from_csv) or other formats.
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?
Describes two acceptable input formats but does not provide guidance on when to use this tool versus alternatives like make_table_from_csv or debug_table.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_table_previewA
Print a preview/example table with sample data.
Args: style: "thai" (default) -- example with Thai/Pali characters "simple" -- plain English example fmt: "grid" (default), "box", "pipe", or "safe" table_style: Table style for grid fmt (mysql, separated, etc.)
Returns: Formatted example table.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | thai | |
| fmt | No | grid | |
| table_style | No | mysql |
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 clearly states the tool prints a preview, indicating no destructive side effects. However, it doesn't explicitly mention that no modifications are made, which would be ideal for full transparency.
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 concise and well-structured: a one-line purpose, then a bulleted list of parameters with all values enumerated. Every sentence earns its place, and it is front-loaded with the 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?
Given the tool is a simple preview with no side effects and an output schema exists (from context signals), the description is complete. It covers the purpose, all parameters, and the return value is implied by the output schema. No gaps remain.
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?
Schema description coverage is 0%, so the description must compensate. It explains each parameter: style with example values ('thai' with Thai/Pali, 'simple' with English), fmt with options ('grid', 'box', 'pipe', 'safe'), and table_style with examples ('mysql', 'separated'). This adds significant meaning 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 the tool prints a preview/example table with sample data. This is a specific verb+resource combination that distinguishes it from siblings like make_table (which presumably creates actual tables) or analyze_table (which analyzes tables).
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 implicitly suggests using this tool for previewing table formats, but it does not explicitly state when to use it vs. alternatives or provide exclusions. The docstring implies usage through its purpose, but lacks direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_table_textA
Validate structural integrity of a table (box/grid/pipe).
Auto-detects format, then checks:
Border/data line alternation
Marker positions (+, ┬, etc.) are consistent
Column count is stable across rows
First and last lines are correct border type
Args: table_text: Raw table text (box, grid, or pipe format)
Returns: Validation report with any structural issues
| Name | Required | Description | Default |
|---|---|---|---|
| table_text | Yes |
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 the full burden. It explicitly lists the checks performed: auto-detecting format, border/data line alternation, marker position consistency, column count stability, and correct border type. It also states the return type: a validation report with structural issues. This gives the agent a clear understanding of behavior.
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 efficiently structured: a one-line purpose, a bullet list of checks, and clear Args/Returns sections. Every sentence adds value, and the most critical information (purpose) appears first. No redundant phrases or filler.
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 context (1 required parameter, output schema exists), the description covers the essential aspects: the single parameter with format constraints, the checks performed, and the return type. The output schema handles return structure details, so the description does not need to list fields. A complete and sufficient description for the agent.
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 has one parameter 'table_text' with only a title and no description (0% coverage). The description adds meaning by stating 'Raw table text (box, grid, or pipe format)', clarifying the acceptable formats and that it is raw text. This is valuable beyond the schema, though a note about expected input length or encoding would improve it further.
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 validates structural integrity of tables in various formats (box/grid/pipe). It specifies the resource (table text), the action (validate), and the scope of validation (structural checks). This distinguishes it from sibling tools like analyze_table, which may perform deeper analysis, and make_table which creates tables.
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 provide guidance on when to use this tool versus alternatives like analyze_table or debug_table. There is no mention of prerequisites, constraints, or scenarios where validation is appropriate. The agent must infer usage from context, which could lead to incorrect tool selection.
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. Dates show when Glama detected each change.
7 tool updates
v0.1.0- First observed
analyze_table - First observed
debug_table - First observed
make_table - First observed
make_table_from_csv - First observed
make_table_from_json - First observed
make_table_preview - First observed
validate_table_text
TDQS
Each tool has a clearly distinct purpose: analysis, debugging, creation from various inputs, preview, and validation. Overlap is minimal, and agents can easily select the right tool.
All tool names follow a consistent verb_noun pattern using snake_case, making the set predictable and easy to navigate.
Seven tools is within the ideal range (3-15) and each tool contributes meaningfully to the server's table-focused scope without being excessive.
The tool set covers the full lifecycle: creation from raw data, CSV, JSON, preview, analysis, debugging, and validation. No obvious gaps for the intended domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for tabletopsimulator documentation, generated by doc2mcp.
Bar-first MCP server for Tabula chart authoring, PNG rendering, and editor handoff.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for Crowdin — projects, files, strings, translation progress, tasks, and members.
Related MCP Servers
- MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that provides tools for analyzing, linting, formatting, and generating Markdown content. It enables users to programmatically manage Markdown files through features like table of contents generation, statistics calculation, and JSON-to-table conversion.551MIT
- 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-
- FlicenseAqualityDmaintenanceAn MCP server that provides utility tools for markdown processing, including ADF-to-markdown conversion, table formatting, and table of contents management.7-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dhammawatthumpra-coder/ascii-table-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server



