Skip to main content
Glama

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.

Web Tool Preview


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 + more

  • 10 grid sub-styles: mysql, separated, compact, gfm, reddit, rounded, rst, box, unicode, dots — inspired by ozh/ascii-tables

  • Auto-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, compact

  • CSV / 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

dark

dark

Discord / Telegram dark mode

light

light

Documentation, PDF

minimal

minimal

Blog posts, websites

compact

compact

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-mcp

pip install

git clone https://github.com/dhammawatthumpra-coder/ascii-table-mcp.git
cd ascii-table-mcp
pip install -e .
python -m ascii_table_mcp

Register 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

headers

list[str]

Column headers

rows / data

list[list[str]]

Data rows

fmt

str

"grid"

"grid", "box", "pipe", "safe", "html"

style

str

"mysql"

One of 10 grid styles or 4 HTML styles

auto_format

bool

true

Right-align numbers, center headers

safe_width

bool

false

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

headers

list[str]

Column headers

rows / data

list[list[str]]

Data rows

style

str

\"dark\"

\"dark\", \"light\", \"minimal\", \"compact\"

font_size

int

24

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 analysis

  • analyze_table — validates column alignment in +--+ tables

  • validate_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 positions

Solution: 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

mysql

+--+

+--+

+--+

+--+

default

separated

+==+

+==+

+--+

+--+

bold header separator

compact

none

---

none

none

frameless

gfm

none

|--|

none

none

GitHub Flavored Markdown

reddit

none

--|--

none

none

Reddit tables

rounded

.--.

:+:

none

'--'

rounded corners

rst

+==+

+--+

+==+

+==+

reStructuredText

box

┌┬┐

├┼┤

├┼┤

└┴┘

Unicode box-drawing

unicode

╔╦╗

╠╬╣

╠╬╣

╚╩╝

double-line

dots

┌┬┐

├┼┤

none

└┴┘

no row separators

Format comparison

Format

Example

Best for

grid

+----+----+

Terminal, code review, GitHub

box / safe

┌────┬────┐

Presentation, formal docs

pipe

| | |

Markdown-native

grid + safe_width

+------+----+

Discord, browser (zero-width ≠ 0)

png

<image>

Direct export — Discord/Telegram/chat apps

svg

<vector>

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.png

Why 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 ✅
+---------+-----------+


License

MIT — free for personal and commercial use.

Available Tools

7 tools
analyze_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

ParametersJSON Schema
NameRequiredDescriptionDefault
table_textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
headersNo
rowsNo
dataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
headersNo
rowsNo
dataNo
fmtNogrid
styleNomysql
auto_formatNo
safe_widthNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
csv_textYes
delimiterNo,
has_headerNo
fmtNogrid
styleNomysql
auto_formatNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
json_dataYes
has_headerNo
fmtNogrid
styleNomysql
auto_formatNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleNothai
fmtNogrid
table_styleNomysql

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
table_textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 7 tool updatesv0.1.0
    • First observedanalyze_table
    • First observeddebug_table
    • First observedmake_table
    • First observedmake_table_from_csv
    • First observedmake_table_from_json
    • First observedmake_table_preview
    • First observedvalidate_table_text

TDQS

A4/5.0
Disambiguation5/5

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.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case, making the set predictable and easy to navigate.

Tool Count5/5

Seven tools is within the ideal range (3-15) and each tool contributes meaningfully to the server's table-focused scope without being excessive.

Completeness5/5

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

ActivityInactive
ResponsivenessNo issues

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

Related MCP Servers

Latest Blog Posts

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