Skip to main content
Glama
german-borisevich

Apache Zeppelin MCP Server

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ZEPPELIN_BASE_URLYesThe base URL of the Apache Zeppelin server (e.g., http://your-zeppelin-host:8080)
ZEPPELIN_PASSWORDYesThe password for Zeppelin authentication
ZEPPELIN_USERNAMEYesThe username for Zeppelin authentication

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_notebooksA

List notebooks on the Zeppelin server.

Always use name_filter to narrow results — the server may have thousands of notebooks.

Args:
    name_filter: Optional substring filter (case-insensitive) matched against the full path.
    limit: Maximum number of notebooks to return (default 100, 0 = unlimited).
search_notebooksB

Full-text search across all notebook paragraphs.

Args:
    query: Search query string
    max_results: Maximum number of results to return (default 20, 0 = unlimited).
get_notebookA

Get notebook overview with all paragraph code, titles, and status. Does not include paragraph output — use get_paragraph to inspect output of specific paragraphs.

For large notebooks, prefer list_paragraphs first to identify paragraphs of interest,
then get_paragraph_code for targeted reads.

Args:
    notebook_id: The notebook ID to retrieve
    include_config: If True, include visualization/chart config and presentation
        flags (editorHide, runOnSelectionChange) for each paragraph. Default False.
list_paragraphsA

List paragraph metadata (index, id, title, status) without code or output.

Paragraphs whose presentation config deviates from the finalized standard are
marked inline: [editor visible] when editorHide is not true, and
[runs on selection change] when the paragraph has forms but
runOnSelectionChange is not false. Unmarked paragraphs are properly finalized.

Args:
    notebook_id: The notebook ID to list paragraphs for
get_paragraphA

Get full content of a single paragraph (code, output, dynamic forms, chart config, and presentation flags like editorHide / runOnSelectionChange).

By default, table output is limited to 50 rows and HTML output is omitted to save tokens.
When investigating data discrepancies, set max_rows=0 for unlimited rows.
If the paragraph uses HTML rendering (without z.show()), set include_html=True to see
text extracted from HTML. Alternatively, query the underlying data via SQL if available.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to retrieve
    max_rows: Maximum data rows for table output (default 50, 0 = unlimited). Header row always included.
    include_html: If True, include HTML output converted to plain text. If False (default), HTML is omitted.
get_paragraph_codeA

Get only the code/text content of a paragraph, without output or forms. Use this instead of get_paragraph when you only need to read the code to save on output size.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to retrieve
get_paragraph_formsB

Get dynamic form definitions and current parameter values for a paragraph.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to inspect
update_paragraph_formsA

Update dynamic form values without re-executing the paragraph. Safest way to change form parameters when chart settings must be preserved.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to update
    params: Dict of form values to set, e.g. {"city": "Seoul", "limit": "10"}.
update_paragraph_configA

Update paragraph visualization/chart config (graph type, columns, display settings). Fetches current config and deep-merges provided changes. Column index and aggr fields are auto-filled from the paragraph's output headers — only provide name. Auto-fill needs saved output: run the paragraph at least once first, otherwise index/aggr cannot be auto-filled and columns are passed through as given.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to configure
    config: Dict of config fields to set or update. Merged with existing config.
        To change chart type, set graph.mode to one of:
        "table", "multiBarChart", "stackedAreaChart", "lineChart",
        "pieChart", "scatterChart".
        Example: {"graph": {"mode": "multiBarChart",
                            "keys": [{"name": "date_col"}],
                            "values": [{"name": "amount_col"}]}}
batch_update_paragraph_configA

Update visualization/chart config for multiple paragraphs in one call (batch version of update_paragraph_config). Each config is deep-merged with that paragraph's existing config. Column index/aggr auto-fill needs saved output: run each paragraph at least once first, otherwise index/aggr cannot be auto-filled and columns are passed through as given.

Prefer this over many update_paragraph_config calls — it collapses N round-trips into one.
Paragraphs are processed sequentially; one failing item does not stop the rest (failures are
reported in the result).

Args:
    notebook_id: The notebook ID containing the paragraphs
    configs: List of config changes, each {paragraph_id, config}. See update_paragraph_config
        for the config dict format (graph.mode, keys/groups/values, etc.).
update_paragraphA

Update paragraph code/text. Previous content is automatically backed up before changes.

Sends the whole new text — for small targeted changes prefer edit_paragraph, which sends
only the changed snippet.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to update
    text: The new code/content for the paragraph
    title: Optional new title for the paragraph
batch_update_paragraphA

Update multiple paragraphs in one call (batch version of update_paragraph). Previous content of each changed paragraph is automatically backed up.

Prefer this over many update_paragraph calls when editing several paragraphs — it collapses
N round-trips into one. Paragraphs are updated sequentially; one failing item does not stop
the rest (failures are reported in the result).

For small targeted changes prefer batch_edit_paragraph, which sends only changed snippets.

Args:
    notebook_id: The notebook ID containing the paragraphs
    updates: List of edits, each {paragraph_id, text, title?}.
edit_paragraphA

Replace an exact snippet of paragraph code (find-and-replace). Previous content is automatically backed up before changes.

Prefer this over update_paragraph for targeted changes — you send only the changed snippet
instead of the whole paragraph. Use update_paragraph for whole rewrites.

old_string must match the current code exactly, including whitespace and indentation: copy it
from get_paragraph_code (raw text), not from get_notebook/get_paragraph (they indent code by
2 spaces). Keep it minimal but unique — include a neighbouring line if the snippet repeats.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to edit
    old_string: Exact existing text to replace (must occur once unless replace_all)
    new_string: Replacement text
    replace_all: Replace every occurrence instead of requiring a unique match (e.g. renames)
batch_edit_paragraphA

Apply several find-and-replace edits in one call (batch version of edit_paragraph), across one or more paragraphs. Previous content of each changed paragraph is backed up.

Edits are grouped by paragraph and applied in the given order, each against the result of
the previous one. Per paragraph it is all-or-nothing: if any of its edits fails, that
paragraph is left untouched. Other paragraphs still proceed (failures are reported).

Args:
    notebook_id: The notebook ID containing the paragraphs
    edits: List of edits, each {paragraph_id, old_string, new_string, replace_all?}.
delete_paragraphA

Delete a paragraph. Its content is automatically backed up before deletion.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to delete
batch_delete_paragraphA

Delete multiple paragraphs in one call (batch version of delete_paragraph). Each paragraph's content is automatically backed up before deletion.

Prefer this over many delete_paragraph calls — it collapses N round-trips into one.
Paragraphs are deleted sequentially; one failing item does not stop the rest (failures are
reported in the result).

Args:
    notebook_id: The notebook ID containing the paragraphs
    paragraph_ids: List of paragraph IDs to delete.
move_paragraphA

Move a paragraph to a new position within the same notebook.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to move
    new_index: The target position index (0-based)
create_notebookB

Create a new empty notebook.

Args:
    name: Full path for the new notebook, e.g. "Users/john/ProjectName/Notebook Title"
add_paragraphB

Add a new paragraph to an existing notebook.

Args:
    notebook_id: The notebook ID to add the paragraph to
    text: The code/content for the paragraph
    title: Optional title for the paragraph
    index: Optional position index to insert the paragraph at
batch_add_paragraphA

Add multiple paragraphs to a notebook in one call (batch version of add_paragraph). Paragraphs are created sequentially in the given order.

Prefer this over many add_paragraph calls when scaffolding several cells — it collapses N
round-trips into one. One failing item does not stop the rest (failures are reported).

Args:
    notebook_id: The notebook ID to add paragraphs to
    paragraphs: List of paragraphs to create, each {text, title?, index?}.
clone_paragraphA

Clone a paragraph within the same notebook. The copy is created directly below the source paragraph and carries over its code, title, and visualization/chart config. The clone's title gets a " (copy)" suffix; untitled paragraphs stay untitled.

Zeppelin has no dedicated clone-paragraph endpoint, so this reads the source paragraph,
creates a new one with the same content, then copies its config in a single tool call.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to clone
run_paragraphA

Run a paragraph and return the result. Uses the async job endpoint which preserves chart/visualization settings.

By default, table output is limited to 50 rows and HTML output is omitted to save tokens.
Set max_rows=0 for unlimited rows when you need full results for analysis.
Set include_html=True to see HTML output converted to plain text.

On error, the response includes the error output — examine it before retrying.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to run
    params: Optional dict of dynamic form values, e.g. {"city": "Seoul"}.
    max_rows: Maximum data rows for table output (default 50, 0 = unlimited). Header row always included.
    include_html: If True, include HTML output converted to plain text. If False (default), HTML is omitted.
batch_run_paragraphA

Run several paragraphs one after another in the given order, in a single call. Use this instead of many run_paragraph calls when you need a specific sequence of cells run — e.g. setup cells before the cells that depend on them. Paragraphs run sequentially (not in parallel) because cells typically share interpreter state, and this collapses N round-trips into one.

Each run item may carry its own dynamic form params. The top-level params dict is a shared
default merged under per-item params (the item wins on key conflicts). The same paragraph_id
may appear multiple times with different params — a parameter sweep in one call.

By default table output is limited to 50 rows and HTML output is omitted to save tokens.

Args:
    notebook_id: The notebook ID containing the paragraphs
    runs: Paragraphs to run in execution order, each {paragraph_id, params?}. Example:
        [{"paragraph_id": "p1"}, {"paragraph_id": "p2", "params": {"city": "Seoul"}}]
    params: Optional shared dynamic form values applied to every item, e.g. {"env": "prod"}.
        Per-item params override these per key.
    max_rows: Maximum data rows per table output (default 50, 0 = unlimited). Header row always included.
    include_html: If True, include HTML output converted to plain text. Default False.
    stop_on_error: If True (default), stop at the first paragraph that errors and report the
        remaining ones as skipped. If False, run every paragraph regardless of failures.
run_paragraph_asyncA

Start paragraph execution and return immediately without waiting for results. Use this to run multiple paragraphs in parallel, then check status with get_paragraph_status and read results with get_paragraph.

Chart/visualization settings are preserved automatically.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to run
    params: Optional dict of dynamic form values, e.g. {"city": "Seoul"}.
run_all_paragraphsA

Run all paragraphs in a notebook and wait for completion. Uses the async job endpoint which preserves chart/visualization settings.

Args:
    notebook_id: The notebook ID to run
    params: Optional dict of dynamic form values, e.g. {"city": "Seoul"}.
get_paragraph_statusA

Get execution status of a specific paragraph (useful after async run).

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to check
stop_paragraphA

Stop a running paragraph. Use this to cancel long-running or stuck queries.

Args:
    notebook_id: The notebook ID containing the paragraph
    paragraph_id: The paragraph ID to stop
get_notebook_permissionsA

Get permission information for a notebook (owners, writers, readers).

Args:
    notebook_id: The notebook ID to get permissions for
set_notebook_permissionsC

Set permission information for a notebook.

Args:
    notebook_id: The notebook ID to set permissions for
    owners: List of usernames with owner access
    writers: List of usernames with write access
    readers: List of usernames with read access
    runners: List of usernames with runner access
get_notebook_fingerprintA

Get a deterministic content fingerprint of a notebook, plus per-paragraph sub-hashes.

Cheap freshness check for cached notebook documentation. Only stable content is
hashed (paragraph id, title, code text); execution status, output, form
values/definitions, chart configs, and paragraph order are all excluded — none of
those flag the notebook stale.

The comparison against the cached doc happens server-side — never hand-compare
hash maps. Preferred: pass `spec_path` (the spec file under $WIKI_DOCS_PATH) and
the server reads the stored fingerprint/units from its frontmatter itself; the
response gains `"match": true|false` and `"diff": {changed, added, removed}`
naming the exact paragraph ids that differ. If the spec can't be used, the
response carries a `spec_note` explaining why and no match/diff. Fallback when
there is no docs repo: pass the stored values explicitly as `known_fingerprint` /
`known_units` (they take precedence over `spec_path` if both are given).

Args:
    notebook_id: The notebook ID to fingerprint
    spec_path: Optional path to the cached spec file inside $WIKI_DOCS_PATH
    known_fingerprint: Optional stored overall fingerprint to compare against
    known_units: Optional stored per-paragraph sub-hash map to diff against
export_notebookA

Export notebook as JSON (for cross-server migration or backup). Warning: output can be very large for notebooks with many paragraphs or large results.

Args:
    notebook_id: The notebook ID to export
import_notebookA

Import a previously exported notebook JSON. Optionally rename it.

Args:
    notebook_json: The full notebook JSON string from export_notebook
    new_name: Optional new name/path for the imported notebook
clone_notebookA

Clone an existing notebook. Optionally rename the copy.

Args:
    notebook_id: The notebook ID to clone
    new_name: Optional full path/name for the cloned notebook (e.g. "Users/john/Project/Copy").
              If omitted, Zeppelin auto-generates a name in the source's parent folder.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.7/5.0

Scored across 33 tools

Disambiguation4/5

Tools have mostly distinct resource+action targets, and descriptions actively steer the agent (e.g., get_paragraph_code vs get_paragraph, edit_paragraph vs update_paragraph, run_paragraph vs run_paragraph_async vs batch_run_paragraph). A few overlaps remain between the get/list variants and the many run flavors, but the guidance is strong enough that an agent can pick correctly.

Naming Consistency5/5

Consistent verb_noun snake_case throughout: list_paragraphs, get_paragraph, update_paragraph, run_paragraph, delete_paragraph, move_paragraph, plus a uniformly prefixed batch_ family (batch_add/edit/delete/run/update). No style mixing.

Tool Count3/5

At 33 tools it sits firmly in heavy territory, with a full parallel batch_ variant for nearly every per-paragraph operation (add, edit, update, delete, run, config). Each earns a rationale (collapsing round-trips), but the surface is larger than the domain strictly requires.

Completeness3/5

Paragraph and run lifecycles are exhaustive (list/get/get_code/forms/config, add/edit/update/move/clone/delete, run/stop/status) and notebooks cover create/list/search/get/export/import/clone plus permissions. However there is no delete_notebook or notebook rename/update, leaving the notebook lifecycle incomplete.

Maintenance

ActivityMaintained
ResponsivenessNo issues