{"ref":"artifact:sac-workbench-mcp","page":"/artifacts/sac-workbench-mcp","json":"/artifacts/sac-workbench-mcp.json","generated":"2026-11-09","drafted_with_ai":true,"entity":{"id":"sac-workbench-mcp","name":"sac-workbench-mcp","artifact_type":"mcp-server","ecosystem":"btp","domain":"ai-and-agents","secondary_domains":["data-and-persistence"],"origin_ring":"independent","use_as":"dependency","description":{"one_line":"An unofficial MCP server that lets an assistant author in [SAP Analytics Cloud](artifact:btp-analytics-cloud): 178 tools sent as the requests the SAC web UI itself sends, from a Chrome session the server signs in once.","short":"MCP server for authoring in SAP Analytics Cloud from an assistant","what_it_solves":"178 tools over [SAP Analytics Cloud](artifact:btp-analytics-cloud)'s own authoring surface. Stories with the charts inside them, down to feeds, filters, colours, hierarchy levels; themes whose CSS is validated against the SAC rules; story scripts; planning models with dimensions, hierarchies, members; plan reads and writes; data actions; files; and the public REST APIs for data import, export, SCIM users, content transport, schedules. Most of that has no documented API behind it: the server starts its own Chrome profile with [Playwright](external:playwright), you sign in once via SSO, and requests then run inside the signed-in SAC page with the CSRF handling the UI uses, so the content library, the modeler and the InA service answer as they do for the browser. Those URLs and payloads were found by recording the UI, and the README states what follows from that: they are not a stable API and may change or break with any SAC update, 2026.21 being the version it was tested against. The public-API tools started from [sap_analytics_cloud_mcp](artifact:jumenengels-sac-mcp) and the authoring tools were added on top of them; those documented `/api/v1` calls stay the one part that can run as a technical user instead, with an OAuth client.","when_not_to_use":"Large parts of it ride on undocumented SAC internals, and the maintainer states both halves of that: the interfaces may change or break with any SAC update, and SAP does not support this software or any change it makes to your tenant. Writes are gated, since a changing tool refuses without `allowalteration: true` and `readOnly: true` blocks them altogether, and the README still asks you to test in a sandbox tenant or folder first and keep backups. The three expert tools (raw JavaScript in the SAC page, raw HTTP to the tenant, replay of a recorded request) bypass the guard rails the regular tools apply, from the automatic snapshot to the signal-colour check, which is why they are off by default.","to_build_on_it":"Adding a tool has a documented path: record the traffic of the SAC page with `sac_capture_start`, do the action in SAC, inspect the captured URL and payload, try the changed call with `sac_replay`, then turn the payload into a template or a builder function. Each module under `src/story/` documents what SAC requires and how it was found out, and `npm run smoke` runs an end-to-end test against a tenant. The two Agent Skills in `skills/`, one for SAC scripting and one for story and theme CSS, are stated to work with this server and on their own."},"links":{"repo":"https://github.com/RafaelSachsNL/sac-workbench-mcp","npm":"https://www.npmjs.com/package/sac-workbench-mcp"},"compat":{"runtimes":["node"],"deployment":["local"]},"type_properties":{"transports":{"value":["stdio"],"sources":[{"url":"https://raw.githubusercontent.com/RafaelSachsNL/sac-workbench-mcp/main/ARCHITECTURE.md","title":"Architecture — sac-workbench-mcp","checked":"2026-11-05","quote":"`@modelcontextprotocol/sdk`, stdio transport"}]}},"provides":[{"capability":"capability:agent-systems-access","what_it_does":"Puts an SAC tenant's authoring surface in front of an assistant: stories, charts, themes, scripts, planning models, plan values, reached through the requests the SAC web UI sends from a session the server signs in itself. The documented public REST APIs are one area among 178 tools.","sources":[{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"178 tools in these areas, plus 3 expert tools for extending the server"},{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"Requests are sent from inside the signed-in SAC page"}]},{"capability":"capability:analytic-modelling","what_it_does":"Creates the model as well as reading it: planning models with their dimensions, hierarchies, members; live models on a connection; the restricted and calculated measures a chart reads.","sources":[{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"`sac_planning_model_create`, `sac_model_dimension_add`, `sac_model_hierarchy_set`, `sac_model_members_set`"},{"url":"https://raw.githubusercontent.com/RafaelSachsNL/sac-workbench-mcp/main/ARCHITECTURE.md","title":"Architecture — sac-workbench-mcp","checked":"2026-11-05","quote":"create models, add dimensions and hierarchies, members"}]},{"capability":"capability:warehouse-loading","what_it_does":"Replaces the facts of an SAC model with `sac_model_data_reload`, writing a CSV backup of them first, and reaches the public data import and export APIs beside it.","sources":[{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"`sac_model_data_reload` writes a CSV backup of the facts before replacing them."},{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"data import / export, users & teams (SCIM), content transport, schedules, calendar, translation, audit, multi actions"}]},{"capability":"capability:tool-governance","what_it_does":"Gates the write side of a tenant an assistant could otherwise change freely: a changing tool refuses without `allowalteration: true`; `readOnly: true` blocks writes whatever the assistant sends; the raw-access tools load only when switched on; plan values land in the private version until a separate publish call.","sources":[{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"Every tool that changes something requires `allowalteration: true`"},{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"`readOnly: true` blocks all writes, whatever the assistant sends."}]}],"requires":[{"ref":"artifact:btp-analytics-cloud","for":"The tenant every tool acts on, with a user whose rights decide what the assistant can do there.","requirement":"required","basis":"binding","role":"target-system","sources":[{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"An SAP Analytics Cloud tenant and a user with the rights you want the assistant to use."}]},{"ref":"external:google-chrome","for":"The browser the server drives with a persistent profile of its own, where the SSO login happens and from inside whose SAC page the requests are sent; another channel can be set with `SAC_BROWSER_CHANNEL`.","requirement":"required","basis":"binding","role":"browser","sources":[{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"Google Chrome (or set `SAC_BROWSER_CHANNEL`)"},{"url":"https://raw.githubusercontent.com/RafaelSachsNL/sac-workbench-mcp/main/ARCHITECTURE.md","title":"Architecture — sac-workbench-mcp","checked":"2026-11-05","quote":"`playwright-core` driving the installed Chrome with a persistent profile"}]},{"ref":"artifact:btp-datasphere","for":"Needed for the Datasphere side of the tool set: dashboards built on Datasphere models, and the space search, both reaching the model through a live connection in SAC.","requirement":"conditional","basis":"binding","role":"model-source","condition":"a Datasphere model is used","sources":[{"url":"https://github.com/rafaelsachsnl/sac-workbench-mcp","title":"sac-workbench-mcp — README","checked":"2026-11-05","quote":"For Datasphere models a live connection to SAP Datasphere."}]}],"connects":[{"ref":"artifact:btp-analytics-cloud","kind":"data","direction":"outbound","style":"sync","for":"Reads and writes the tenant's content and data over the services the SAC UI itself calls: the content library for story and theme content, the modeler for models with their dimensions and members, InA for model metadata and for plan reads, writes, publishing. The documented `/api/v1` REST APIs are called beside them.","sources":[{"url":"https://raw.githubusercontent.com/RafaelSachsNL/sac-workbench-mcp/main/ARCHITECTURE.md","title":"Architecture — sac-workbench-mcp","checked":"2026-11-05","quote":"metadata of SAC and Datasphere models, plan reads/writes, publish/revert"},{"url":"https://raw.githubusercontent.com/RafaelSachsNL/sac-workbench-mcp/main/ARCHITECTURE.md","title":"Architecture — sac-workbench-mcp","checked":"2026-11-05","quote":"read/write story, theme, composite and model content; folders; copy, move, delete"}]}],"provenance":{"discovered_via":[{"source":"source:github"}],"first_seen":"2026-11-05"},"drafted_with_ai":true},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"good","evidence":"released this month"},{"label":"Continuity","tier":"fair","evidence":"one contributor, personally owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-11, not archived"}],"compatibility":[{"label":"Declared for","tier":"unknown","evidence":"no BTP release lines in the atlas"},{"label":"Survived majors","tier":"unknown","evidence":"no BTP release lines in the atlas"},{"label":"Maintainer's CI","tier":"good","evidence":"CI green, 2026-11-05"}],"practice":[{"label":"Tests","tier":"poor","evidence":"none found in the tree"},{"label":"Docs","tier":"good","evidence":"docs/ with 3 pages, README 15 KB"},{"label":"Changelog","tier":"good","evidence":"CHANGELOG in the repo"}],"reach":[{"value":346,"unit":"installs/week"},{"value":6,"unit":"watching"}]},"signals":{"crawled_at":"2026-11-08","latest_version":"0.3.0","majors":{"0.3":{"version":"0.3.0","date":"2026-11-05"}},"license":"MIT","first_release":"2026-11-05","last_release":"2026-11-05","releases":2,"cadence_days":null,"maintainers":1,"repository":"git+https://github.com/RafaelSachsNL/sac-workbench-mcp.git","repository_directory":null,"peer_cds":null,"dependencies":3,"node_engine":">=22","test_script":false,"types":true,"downloads_weekly":346,"downloads_monthly":346,"stars":6,"forks":3,"open_issues":0,"archived":false,"pushed_at":"2026-11-05","language":"TypeScript","license_spdx":"MIT","org_owned":false,"default_branch":"main","created_at":"2026-11-01T09:28:26Z","open_prs":0,"tree_truncated":false,"test_files":0,"workflows":1,"other_ci":false,"readme_bytes":15194,"docs_files":3,"changelog":true,"license_file":true,"dts_files":0,"first_commit":"2026-11-01","last_commit":"2026-11-05","commits":3,"contributors":1,"ci_status":"success","ci_run_at":"2026-11-05","ci_workflow":"CI","ci_event":"push","readme_path":"README.md","readme_sha":"ca244c212f48bf90d3967e41b69e803c1eec69fd","months_since_release":0,"dormant":false,"repo_read":"2026-11-08"},"release_notes":{"license":"MIT","quotable":true,"prereleases":1,"source":{"kind":"npm","path":"CHANGELOG.md","version":"0.3.0","url":"https://github.com/RafaelSachsNL/sac-workbench-mcp/blob/main/CHANGELOG.md"},"format":"keep-a-changelog","releases":[{"version":"0.3.0","date":"2026-11-05","date_source":"heading","heading":"[0.3.0] — 2026-11-05 — first public release","url":"https://github.com/RafaelSachsNL/sac-workbench-mcp/blob/main/CHANGELOG.md#030--2026-11-05--first-public-release","sections":[{"kind":"feature","heading":"Added","items":14},{"kind":"security","heading":"Security","items":2}],"hash":"7a35332a91006915"}],"versions":[{"version":"0.3.0","date":"2026-11-05"}],"crawled_at":"2026-11-08"},"edges":{"maintainers":[],"contributors":[],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}