A read-only Model Context Protocol server that lets LLMs query eazyBI — Reports & Charts for Jira. Plug it into Claude Desktop, Claude Code, Cursor, or any other MCP-compatible client and ask things like:
"Pull the Cycle Time report for Q1 2026 from eazyBI and tell me what changed." "List the dashboards in account 250143 and summarise the velocity ones." "Export report 5259102 as CSV to my Downloads folder."
The server is intentionally read-only — it cannot modify reports, dashboards, or data — so giving it an API token is low-risk.
eazyBI builds incredibly powerful Jira analytics, but its data lives behind an OLAP cube and a UI. If you want an LLM to reason over your team's velocity, cycle time, throughput, or any custom metric you've already modeled in eazyBI, you have two options: re-implement the analysis against the Jira API (slow, brittle, ignores your calculated members), or run the saved report you already have and feed the result into the LLM. This server does the second.
eazyBI publishes exactly one REST endpoint as part of its supported public API: the Report Results Export API. That is what export_report and get_export_url wrap. eazyBI Support has stated explicitly that there is no REST API for listing or publishing reports / dashboards — not on Cloud, not on Data Center, not on eazyBI.com.
The remaining list_* / get_* tools probe internal Rails JSON routes (/accounts.json, /accounts/{id}/cubes.json, …) that the eazyBI UI itself consumes. They are not part of any documented contract:
- on Atlassian Cloud these routes reject Basic auth — they always return
{"supported": false}and you should not rely on them; - on Data Center / Private eazyBI they often happen to work (Jira's plugin framework gates everything with the same auth) but eazyBI Support recommends against treating them as a stable interface.
So the realistic picture is: export_report is the rock-solid path; everything else is a "good luck" probe of UI internals. The export tool is enough for almost every reporting workflow — if you know account_id and report_id, you can run any saved report end-to-end.
| Tool | Status | What it does |
|---|---|---|
export_report |
stable | Run a saved report by ID and return data as JSON / CSV / XLS / PDF / PNG. Supports selected_pages for page-filter overrides and embed_token for publicly shared reports. |
get_export_url |
stable | Build the canonical export URL for a report — no HTTP request made. |
list_accounts |
experimental | List eazyBI accounts visible to the authenticated user. |
list_reports |
experimental | List reports in an account, optional folder filter. |
get_report_definition |
experimental | Full JSON definition of a report (rows / columns / pages / calculated members). |
list_dashboards |
experimental | List dashboards in an account. |
get_dashboard |
experimental | Layout of a dashboard and the IDs of the reports it contains. |
list_cubes |
experimental | List OLAP cubes available in an account. |
get_cube |
experimental | Full cube metadata: dimensions, hierarchies, measures. |
list_dimensions |
experimental | Dimensions of a cube. |
list_measures |
experimental | Measures of a cube, optional folder filter. |
list_hierarchies |
experimental | Hierarchies of a single dimension. |
Pick one of the install options below, then hand the binary to your MCP client.
brew install uv # one-time
uv tool install --from git+https://github.com/ultimate-guitar/eazybi-mcp eazybi-mcppipx install git+https://github.com/ultimate-guitar/eazybi-mcpgit clone https://github.com/ultimate-guitar/eazybi-mcp
cd eazybi-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e .Copy .env.example to .env (or set the variables in your MCP client's env block) and fill in:
EAZYBI_BASE_URL=https://aod.eazybi.com # eazyBI for Jira Cloud
[email protected]
EAZYBI_API_TOKEN=your-atlassian-api-token # https://id.atlassian.com/manage-profile/security/api-tokens
EAZYBI_DEFAULT_ACCOUNT_ID=12345 # optional, looked up from the URL after /accounts/| Deployment | EAZYBI_BASE_URL |
Auth |
|---|---|---|
| eazyBI for Jira Cloud | https://aod.eazybi.com |
Atlassian email + API token |
| eazyBI for Jira / Confluence Data Center | https://your-jira.example.com/plugins/servlet/eazybi |
Jira/Confluence username + password (or PAT) |
| eazybi.com (SaaS) | https://eazybi.com |
eazyBI account email + password |
Cloud users: the URL inside the eazyBI iframe in Jira looks like
https://aod.eazybi.com/eazy/accounts/.../.... The/eazysegment is for UI routes only — setEAZYBI_BASE_URLwithout it. The export endpoint lives at the bare host.
Public reports: if a report is shared via "Embed report → Public access token", pass
embed_token="..."toexport_reportand skip Basic auth.
Open a report in eazyBI; the URL looks like …/accounts/250143/cube_reports/5259102 (or …/reports/5259102-foo). The first number is account_id, the second is report_id. The "Embed report" action in the eazyBI toolbar surfaces both as well.
Edit claude_desktop_config.json:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"eazybi": {
"command": "uvx",
"args": ["--from", "git+https://github.com/ultimate-guitar/eazybi-mcp", "eazybi-mcp"],
"env": {
"EAZYBI_BASE_URL": "https://aod.eazybi.com",
"EAZYBI_USER": "[email protected]",
"EAZYBI_API_TOKEN": "your-atlassian-api-token",
"EAZYBI_DEFAULT_ACCOUNT_ID": "12345"
}
}
}
}For a globally-installed binary use "command": "eazybi-mcp", "args": [] instead.
After editing, fully quit Claude Desktop (Cmd+Q on macOS) and reopen it — closing the window is not enough.
claude mcp add eazybi -- eazybi-mcp \
--env EAZYBI_BASE_URL=https://aod.eazybi.com \
--env [email protected] \
--env EAZYBI_API_TOKEN=your-atlassian-api-tokenPoint the client at the eazybi-mcp binary; pass the env vars in whatever way your client supports.
Once wired up:
- "What's the P85 cycle time for Q1 2026? Pull report 5259102 from eazyBI."
- "List all reports in the 'Velocity' folder of my eazyBI account."
- "Export report 5259102 as CSV and save to ~/Downloads/cycle-time.csv."
- "Compare the last three quarters of cycle time and tell me if the trend is up or down."
The LLM picks tools automatically. For Cloud users only export_report is reliable — that's enough for most reporting tasks.
import asyncio
from eazybi_mcp.client import EazyBIClient, EazyBIConfig
async def main():
client = EazyBIClient(EazyBIConfig.from_env())
payload, ctype = await client.export_report(
account_id=250143,
report_id=5259102,
fmt="json",
)
print(ctype, len(payload))
await client.aclose()
asyncio.run(main())- eazyBI does not expose a public API to fetch dashboard data as a single payload. Use
get_dashboard(Data Center / Private only) to discover the constituent report IDs, then callexport_reportfor each. - Arbitrary MDX execution is intentionally not wired up — eazyBI does not document a public endpoint for it. If your private deployment exposes one, extend
EazyBIClientaccordingly. - Large JSON exports are truncated by the
max_charsparameter. Passsave_to=/path/to/file.jsonto write the full payload to disk. - This is an unofficial integration. eazyBI may change the experimental routes at any time; the stable export endpoint is the long-term contract.
Issues and PRs welcome. Please don't commit your .env or any token — the project's .gitignore excludes .env precisely for that reason. To add a new tool:
- Add the HTTP call to
EazyBIClientinsrc/eazybi_mcp/client.py. - Wrap it as a
@mcp.tool()insrc/eazybi_mcp/server.py. - Mark it
[stable]only if it hits a documented public endpoint; otherwise[experimental]and route it through_safe_experimentalso 401/404 responses degrade gracefully.
MIT