MCP SAP GUI Server
This MCP server lets AI assistants operate SAP GUI for Windows through SAP's Scripting API.
Connect to open or named SAP systems/sessions and list available connections.
Read screens, fields, status messages, tables, ALV grids, table controls, classic lists, trees, text editors, and popups.
Fill fields and batch forms, edit table cells, set text editors, select checkboxes, radio buttons, tabs, dropdowns, and table rows.
Navigate transactions, menus, buttons, function keys, toolbars, ALV menus, and SPRO/customizing trees.
Handle popups, including confirmations, warnings, F4 lists, and SAP messages.
Preview screens and pending writes, and capture screenshots.
Configure confirmation gates, save confirmation, audit logging, transaction policies, and read-only safeguards.
Use built-in workflow/transaction guides and disconnect safely when done.
Provides tools to connect to SAP systems, execute transactions, read/write screen fields, interact with ALV grids, tree controls, and take screenshots via SAP GUI Scripting API.
Click on "Deploy 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., "@MCP SAP GUI Server What system am I logged into?"
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.
MCP SAP GUI Server
An MCP server that lets AI assistants work in SAP GUI for Windows: ask in plain language, and the assistant reads screens and tables, fills in fields, runs transactions and handles popups, through SAP's own Scripting API. A save with F11 or the Save button waits for your yes (what asks).
It works with any MCP client that can start a local server: Claude Code, GitHub Copilot, Codex, Google Antigravity and others.
What it does
Looks things up: display transactions, fields, ALV grids, table controls, classic report lists and trees, read in full however long they are.
Fills in and changes: fields, checkboxes, dropdowns, whole forms, table cells, F4 value help, table maintenance and IMG activities.
Navigates: transactions, buttons, function keys, menus, tabs, SPRO and other trees.
Handles popups, recognising questions, warnings, F4 lists and SAP messages in any logon language.
Shows before it saves: a preview of the screen and the values about to be written, and screenshots on request.
More, with example prompts: What it can do.
Related MCP server: SAP RFC MCP Server
Requirements
Windows with SAP GUI for Windows (8.10 verified, 8.00 works; SAP GUI versions), and SAP Logon running.
SAP GUI Scripting allowed in SAP GUI and on the SAP system: Preparing SAP.
uv, which runs the server from PyPI.
An MCP client. To approve saves, one that shows the server's confirmation questions (listed below).
Quick start
Install uv:
winget install --id=astral-sh.uv -eAdd the server to your MCP client:
Command: uvx Arguments: mcp-sap-gui[screenshots] Transport: stdioIn the Claude Code CLI, for example:
claude mcp add sap-gui --scope user -- uvx "mcp-sap-gui[screenshots]". Every client: Clients.Log on to SAP in SAP Logon, then ask: "Connect to my open SAP session and tell me what system I'm on."
Step by step, including updating to a new release: Getting started.
Safety
Saves wait for your yes, and you can make other changes wait too, for example every field write: Confirmations.
A transaction policy decides which transactions the assistant may start; read-only mode and profiles limit it further.
An audit log records every call, question and answer.
Everything runs as the logged-on SAP user, under that user's authorizations, which remain the real boundary.
Details for admins, Basis and security teams: Security guide.
Which clients show the confirmation questions
Tested on 2026-10-28: the Claude Code CLI, the GitHub Copilot CLI, VS Code with GitHub Copilot and the Codex CLI show them. The Claude desktop app does not (its Code tab declines without showing anything, its Chat and Cowork tabs do not support them), so a save is refused there: use it for reading. The full table: Clients.
Documentation
Page | For |
Installing it and the first questions | |
What to ask, and what is covered | |
Setup per MCP client, and which ones show the confirmation questions | |
What asks, and what each answer does | |
When something does not work | |
Enabling scripting, also for named users or read-only; SAP Business Client | |
Every option and environment variable; profiles, HTTP, code mode | |
Safeguards, the transaction policy, the audit log, a recommended setup | |
Which SAP GUI releases work, and how | |
Every tool the assistant can call | |
What changed in each release |
What's new
0.6.0 supports MCP 2026-07-28, the newest protocol version, next to the earlier ones, and the confirmation questions work on both. It needs Python 3.11 or later, retires sap_set_policy_profile, names the MCP client in the audit log, and comes with reorganised documentation. Every change: CHANGELOG.
Contributing
Bug reports and pull requests are welcome: CONTRIBUTING. Security issues: SECURITY.
License
MIT. See LICENSE.
Disclaimer
This project is not affiliated with, endorsed by, or sponsored by SAP SE. SAP, SAP GUI, and other SAP products mentioned are trademarks of SAP SE.
Use of this software with SAP systems should comply with your SAP licensing agreement and your organization's security policies.
Available Tools
59 toolssap_click_tree_linkSap Click Tree LinkA
Click a hyperlink in a tree node item.
For SPRO/customizing trees, click on the execute icon column (typically item_name='2') to run an activity. Use sap_read_tree to see which columns have link-type items.
Inputs: tree_id (required), node_key (required), item_name (required). Returns: object
sap_collapse_tree_nodeSap Collapse Tree NodeC
Collapse a folder node in a tree control (e.g. SPRO/customizing tree).
Inputs: tree_id (required), node_key (required). Returns: object
sap_connectSap ConnectA
Connect to an SAP system by its name in SAP Logon Pad.
Credentials are resolved from a .env file (SAP_USER, SAP_PASSWORD, SAP_CLIENT, SAP_LANGUAGE) so passwords never appear in MCP tool calls. Parameters provided here override the .env values (except password). If SAP is already open and logged in, use sap_connect_existing instead.
Inputs: system_description (required), user, client, language. Returns: object
sap_connect_existingSap Connect ExistingARead-only
Connect to an already open SAP session. Use this when SAP is already logged in.
This is the most common starting point. connection_index=0 and session_index=0 connect to the first open session. Also attaches to SAP Business Client / embedded SAP GUI sessions. Indexes come from sap_list_connections; a connection with scripting_disabled=true cannot be attached.
system: pass it only when the user named the SAP system, as 'DEV' or 'DEV/100' (system/client). One open session on it is attached; several, or none, return an error that lists what is open. The indexes are then ignored.
With the 'attach' confirmation point on, the user picks the session in a
dialog unless system names exactly one open session. The response
says how it was chosen (chosen_by: named, dialog or index).
Inputs: system, session_index, connection_index. Returns: object
sap_disconnectSap DisconnectADestructive
Disconnect from the current SAP session and release the binding.
Closes only the sessions this MCP session opened: the one sap_connect logged on in and any /o window opened from it. Sessions that were attached (via sap_connect_existing), and /o windows opened from them, are detached but left open so the user can continue working manually.
Inputs: no named parameters. Returns: object
sap_double_click_cellSap Double Click CellB
Double-click a cell in a table/grid (often opens details or drills down).
Row is zero-based. Column is the column name (from sap_read_table or sap_get_column_info). Works on both ALV and TableControl.
Inputs: row (required), column (required), table_id (required). Returns: object
sap_double_click_tree_itemSap Double Click Tree ItemB
Double-click a specific item (column cell) in a tree node row.
item_name is the column name (e.g., 'Column1', 'Column2'). Use sap_read_tree to discover column names for the tree.
Inputs: tree_id (required), node_key (required), item_name (required). Returns: object
sap_double_click_tree_nodeSap Double Click Tree NodeA
Double-click a node in a tree control (often opens details or drills down).
In SPRO/customizing trees, this may open documentation (hypertext) rather than executing the activity. Use sap_click_tree_link on the execute column (typically column '2') for SPRO activities.
Inputs: tree_id (required), node_key (required). Returns: object
sap_execute_transactionSap Execute TransactionA
Execute (start/run) an SAP transaction code (tcode), e.g. MM03, VA01, SM30.
Navigates to the transaction's initial screen. Always check the screen info in the response to understand what screen you landed on. Some transactions require /n prefix for SCWM (e.g., /n/SCWM/MON). A bare /n leaves the current transaction (unsaved data is lost).
Subject to transaction blocklist/allowlist. Use sap_get_session_info to see the current transaction before navigating away.
Inputs: tcode (required). Returns: object
sap_expand_tree_nodeSap Expand Tree NodeA
Expand a folder node in a tree control to reveal its children.
After expanding, use sap_get_tree_node_children or sap_read_tree to see the newly visible child nodes.
Inputs: tree_id (required), node_key (required). Returns: object
sap_find_tree_node_by_pathSap Find Tree Node By PathBRead-only
Find a tree node key by its path.
E.g., '2\1\2' = 2nd child of root, then 1st child, then 2nd.
Inputs: path (required), tree_id (required). Returns: object
sap_get_alv_toolbarSap Get Alv ToolbarARead-only
Get all toolbar buttons from an ALV grid.
Returns button IDs, texts, and types. Use this to discover available actions (sort, filter, export, etc.) before pressing them with sap_press_alv_toolbar_button. Only works on GuiGridView (ALV), not GuiTableControl.
Inputs: grid_id (required). Returns: object
sap_get_cell_infoSap Get Cell InfoARead-only
Get detailed cell metadata from an ALV grid.
Returns value, changeable, cell_type (Normal, CheckBox, ValueList, Button, ...), state (Normal, Error, Warning, Info: why a cell was rejected), f4_help, hotspot, color, tooltip, max_length; plus checked for a checkbox and list_box_count (entries) for a dropdown cell. Does NOT work on GuiTableControl.
Inputs: row (required), column (required), grid_id (required). Returns: object
sap_get_column_infoSap Get Column InfoARead-only
Get detailed column info from an ALV grid or table control.
Returns column names, titles and tooltips; for an ALV grid also each column's data_type (string, date, decimal, ...) and key flag, for a table control each column's cell_type and cell_id template. For a lighter alternative, use sap_read_table with columns_only=true.
Inputs: grid_id (required). Returns: object
sap_get_combobox_entriesSap Get Combobox EntriesBRead-only
List all entries in a combobox/dropdown.
Returns key-value pairs so you know which values are valid.
Inputs: combobox_id (required). Returns: object
sap_get_current_cellSap Get Current CellBRead-only
Get the currently focused cell position in an ALV grid or table control.
Inputs: table_id (required). Returns: object
sap_get_popup_windowSap Get Popup WindowARead-only
Check if a popup/modal dialog is open (wnd[1], wnd[2], etc.).
Returns the popup's title, text content, and available buttons so you know how to respond. Also classifies the popup and suggests a safe next action. Returns {popup_exists: false} if no popup.
The popup's text is in texts: labels and display-only fields (a
message popup's lines). A popup whose body is a classic list (an F4
hit list, a note, a message's long text) has list (cells, rows,
hint) instead: its lines are never in texts or
interactive_elements; read them with sap_read_list. Radio buttons
and checkboxes in interactive_elements carry selected. texts,
buttons and interactive_elements are left out when empty.
Inputs: no named parameters. Returns: object
sap_get_screen_elementsSap Get Screen ElementsARead-only
Discover all elements on the current SAP screen.
Useful for finding field IDs when working with a new screen.
Use type_filter and changeable_only to reduce response size on complex screens (e.g. type_filter="GuiTextField,GuiCTextField" to find only input fields).
max_depth controls how deep to recurse into containers (default 2). Use max_depth=1 for a quick overview, max_depth=3+ for deeply nested layouts (splitter containers, tab strips with sub-containers).
Pass container_id='wnd[0]/mbar' to discover the menu bar structure.
Radio buttons and checkboxes report selected (true/false); a dropdown reports its selected key.
A table control (SM30-style) is ONE element here, not one per cell: use sap_read_table(columns_only=true) for its columns and cell_id templates. A classic list (report WRITE output, SE16 standard list, F4 hit list) is left out and reported under 'lists': read it with sap_read_list. expand_tables=true lists every visible cell of both (large).
Docking containers sit BESIDE the user area, not inside it: the dialog-structure tree of a view cluster (SM34, most IMG activities) and the SE80 tree are under 'wnd[0]/shellcont'. When the window has any, the response lists them as docking_containers; discover them with that id, or pass container_id='wnd[0]' (max_depth=1) for all top-level areas.
Inputs: max_depth, type_filter, container_id, expand_tables, +1 more. Returns: object
sap_get_screen_infoSap Get Screen InfoARead-only
Get current SAP screen info: transaction, program, screen number, window title, and status bar message (success/error/warning text).
Reads from session.ActiveWindow so the response always reflects
what the user sees. The active_window field tells you which
window is in focus (e.g. wnd[0] for the main screen, wnd[1]
for a popup). The title comes from the active window.
Every action tool (press_button, send_key, select_menu, etc.) returns this same screen info, so you always know when a popup appears. Use sap_get_popup_window for full popup content (texts, buttons).
Present only when true: message_has_long_text (sap_press_button on 'wnd[0]/sbar' opens it) and message_as_popup (the message also sits in a popup that must be closed first).
Present only when set: subscreens, the sub-screens on the active window as "program:dynnr", outer first (program / screen_number name only the main screen, so an RF step, a tab page or a detail area that changes shows only here), and cursor, the ID of the field the cursor is in. A screen redisplayed without a message, e.g. for an empty required field, still moves the cursor to that field.
Inputs: no named parameters. Returns: object
sap_get_session_infoSap Get Session InfoARead-only
Get information about the current SAP session (system, client, user, transaction, screen).
Also the SAP GUI release (sap_gui_version) and scripting_read_only: when true, the SAP server allows read-only scripting and write tools refuse.
Inputs: no named parameters. Returns: object
sap_get_table_control_row_infoSap Get Table Control Row InfoARead-only
Get row metadata (selectable, selected) from a GuiTableControl.
If rows is omitted, queries all visible rows. Does NOT work on ALV grids.
Inputs: table_id (required), rows. Returns: object
sap_get_toolbar_buttonsSap Get Toolbar ButtonsARead-only
List all buttons on the system toolbar (tbar[0]) and app toolbar (tbar[1]).
Returns button IDs, text, tooltip, and enabled state. This is for standard SAP toolbars, NOT ALV (use sap_get_alv_toolbar for ALV).
Inputs: window_id. Returns: object
sap_get_transaction_guideSap Get Transaction GuideARead-only
Return a generic, read-first guide for a supported SAP transaction.
Available transactions:
/SCWM/MON: EWM Warehouse Monitor with tree navigation and ALV results.
SM30: table/view maintenance and view clusters (SM34) - also what most IMG activities open: reading the table, the docked dialog-structure tree, new entries, saving and the customizing request prompt.
Aliases accepted: SCWM/MON, warehouse monitor, ewm warehouse monitor,
SM34, table maintenance, view maintenance, view cluster.
Inputs: transaction (required), task. Returns: object
sap_get_tree_node_childrenSap Get Tree Node ChildrenA
Get direct children of a tree node. Much faster than read_tree for step-by-step navigation of deep trees (e.g., SPRO).
Omit node_key or pass empty string for root-level nodes. Set expand=true to expand the node first (requires write permission).
Inputs: tree_id (required), expand, node_key. Returns: object
sap_get_workflow_guideSap Get Workflow GuideARead-only
Return step-by-step guidance for a common SAP workflow.
Available workflows:
search_help: F4 search help on a field.
target= field ID.table_export: Paginated table export.
target= table element ID.spro_navigate: SPRO customizing navigation.
target= activity name.
Inputs: target (required), workflow (required). Returns: object
sap_handle_popupSap Handle PopupA
Read and optionally act on the current popup/modal dialog.
Use when active_window shows wnd[1] or higher. Combines popup inspection and response in a single call.
Actions:
read: return popup content without acting (default)
confirm: press OK/Yes/Continue/Enter on the popup
cancel: press Cancel (or F12) on the popup; never No, which on a save prompt drops the changes
press: press a specific button by its text or tooltip
auto: take only a clearly safe action; otherwise return the popup read-only
A press that may save (a Save button, or Yes/OK on a popup about saving, e.g. "Save the changes first?") asks the user first, like F11 in sap_send_key. So does any answer but Cancel when the popup's question cannot be read (question_readable: false; SAP GUI's Edge browser control). On such a popup, confirm never falls back to Enter, and auto only reads. An accepted press reports confirmed_by_user: true.
Returns the popup contents plus classification, requested action, and post-action screen/popup state when something was pressed.
Inputs: action, button_text. Returns: object
sap_list_connectionsSap List ConnectionsARead-only
List all open SAP connections and sessions.
Covers SAP Logon plus SAP Business Client / embedded SAP GUI sessions
(host: saplogon | sapguiserver). A connection with no sessions and
scripting_disabled: true means the server parameter sapgui/user_scripting
is off, so no session can be read. Each session has its system, client,
user, transaction, session_number (the "(2)" in "DEV(2)") and window
title.
Inputs: no named parameters. Returns: object
sap_modify_cellSap Modify CellA
Modify the value of a cell in an ALV grid or table control.
Only works on editable cells. Use sap_get_cell_info to check if a cell is changeable before attempting to modify it.
Inputs: row (required), value (required), column (required), grid_id (required). Returns: object
sap_press_alv_toolbar_buttonSap Press Alv Toolbar ButtonA
Press a toolbar button on an ALV grid (e.g., sort, filter, export).
Use sap_get_alv_toolbar to find button IDs. A menu button (Menu / ButtonAndMenu) opens its menu and the response lists menu_items (text and function_code); pick one with sap_select_alv_context_menu_item.
Inputs: grid_id (required), button_id (required). Returns: object
sap_press_buttonSap Press ButtonA
Press (click) a pushbutton or toolbar button on the current SAP screen.
Returns screen info after the press so you can detect navigation or popups. Use sap_get_toolbar_buttons to discover toolbar button IDs. Use sap_get_screen_elements to find on-screen button IDs. When screen info has message_has_long_text, pressing 'wnd[0]/sbar' opens that long text (Diagnosis / Procedure), usually as a list popup: read it with sap_read_list(window_id='wnd[1]').
A popup button is checked like sap_handle_popup's press: a press that may save, or any answer but Cancel to a popup question the tool cannot read, asks the user first (confirmed_by_user: true when accepted).
Inputs: button_id (required). Returns: object
sap_press_column_headerSap Press Column HeaderA
Click a column header in an ALV grid (triggers sort). Does NOT work on GuiTableControl.
Inputs: column (required), grid_id (required). Returns: object
sap_previewSap PreviewBRead-only
Render a preview card of the current SAP screen for the user: screenshot, session/transaction info, status bar, and the values the agent is about to write (pending_fields). Call before significant writes (batch fills, F11 save) or whenever the user asks to see what's about to happen. Read-only: nothing is written or saved.
Inputs: note, pending_fields, include_screenshot.
sap_read_fieldSap Read FieldARead-only
Read the value of a field on the current SAP screen.
Returns value, type, changeable status, and labels (left/right). For a dropdown, value is the selected entry's text and key its key. For a radio button or checkbox, value is its label and selected says whether it is selected. Use sap_get_screen_elements to discover field IDs on unknown screens.
Inputs: field_id (required). Returns: object
sap_read_listSap Read ListARead-only
Read a classic ABAP list (WRITE output of a report) as lines of text.
Use it when a report shows a plain list rather than an ALV grid (program SAPMSSY0, screen 120), and for F4 hit lists in a popup (window_id= 'wnd[1]'). Such a list has no table object: every word is its own label, so sap_get_screen_elements leaves the cells out and reports it under 'lists'. This returns the page as the lines the user sees, with no screenshot needed.
colors: rows whose text has a semantic list colour, e.g. 'negative' (red, errors), 'positive' (green), 'total', 'heading'
scroll: present when the list is longer than the page; pass scroll_to=position+page_size to read the next page
with_ids=true adds the ID of each line's first label, to set the focus on a line (sap_set_focus) before F2 / double-click
is_list=false means this screen has no list: use sap_read_table
Inputs: with_ids, max_lines, scroll_to, window_id. Returns: object
sap_read_shell_contentSap Read Shell ContentARead-only
Read content from a GuiShell subtype (e.g., HTMLViewer).
An HTML viewer's page text and URL are readable only with the Internet
Explorer browser control; with the Edge control (SAP GUI 7.70+ default,
e.g. the F1 Performance Assistant) the response says so in note.
Use sap_get_screen_elements first to find shell element IDs.
Inputs: shell_id (required). Returns: object
sap_read_tableSap Read TableARead-only
Read rows from a table on the current screen — ALV grid (report/list output) or TableControl (SM30 maintenance view, customizing screens).
Auto-detects the table type. The response includes a 'table_type' field ('GuiGridView' for ALV or 'GuiTableControl') so you know which type-specific tools to use next (e.g., sap_get_alv_toolbar for ALV, sap_scroll_table_control for TableControl).
Use columns_only=true for schema discovery (returns column metadata only, no data). For a TableControl it also gives each column's cell_type and a cell_id template ({row} = zero-based visible row) for sap_set_batch_fields. Use columns to fetch only specific columns (CSV). Use start_row to paginate through large tables. On a TableControl a start_row (0 included) scrolls there first; without one the read starts where the table is scrolled now (e.g. after Position...). first_visible_row says which row is on top.
A TableControl read returns at most the visible rows: page with start_row=next_start_row while has_more is true. start_row_note explains a clamped or failed scroll. total_rows counts its empty lines too (SM30 pads the view). When the read reaches the first empty row, the response has empty_rows_from, that row's absolute index: the data ends there.
Inputs: table_id (required), columns, max_rows, start_row, +1 more. Returns: object
sap_read_texteditSap Read TexteditARead-only
Read the content of a multiline text editor (GuiTextedit) — long texts, notes, comments, document text.
Returns full text and line count. Use max_lines to cap output for large text editors (0 = all lines).
Inputs: textedit_id (required), max_lines. Returns: object
sap_read_treeSap Read TreeARead-only
Read data from a tree control (TableTreeControl, ColumnTreeControl, etc.).
Returns node hierarchy with texts and column values. For large trees (e.g., SPRO with 1000+ nodes), use sap_get_tree_node_children for step-by-step navigation instead. Use sap_search_tree_nodes to find specific nodes by text.
total_nodes is the number of nodes read; truncated=true means the tree has more loaded nodes (available_nodes) than max_nodes allowed.
Inputs: tree_id (required), max_nodes. Returns: object
sap_screenshotSap ScreenshotARead-only
Take a screenshot of the current SAP window.
Use as a fallback when structured tools (sap_get_screen_elements, sap_read_field, sap_read_table) return empty or confusing results, e.g., on Web Dynpro screens where the element tree is non-standard.
To put a screenshot into a document, pass save_path (must end in .png, directory must exist, existing files are never overwritten). The file keeps SAP GUI's full resolution; the inline image is capped at 1920px. The response then also reports the absolute path and pixel size. Set inline=False to skip the image when only the file is needed.
Inputs: inline, save_path.
sap_scroll_table_controlSap Scroll Table ControlA
Scroll a GuiTableControl to a specific row position.
Does NOT work on ALV grids (they handle scrolling internally). For reading data at a specific offset, prefer sap_read_table with start_row parameter — it handles scrolling automatically.
position in the response is the row SAP actually put at the top, which can differ from the one asked for (then requested_position and a note say so). Cell IDs ([col,row]) count visible rows from that row.
Inputs: position (required), table_id (required). Returns: object
sap_search_tree_nodesSap Search Tree NodesARead-only
Search for tree nodes by text. Returns matches with full ancestor paths.
Useful for finding nodes in deep trees where the same label appears in multiple branches. Case-insensitive substring match. Optionally pass column to search in a specific column instead of node text.
Important limitation: Only searches nodes that are already loaded (expanded) in the tree. Collapsed subtrees are not searched. If you don't find what you expect, expand parent nodes first using sap_get_tree_node_children with expand=true, then search again.
total_matches counts the matches returned. stopped_early=true means the search reached max_results before the last loaded node, so more matches are possible.
Inputs: tree_id (required), search_text (required), column, max_results. Returns: object
sap_select_all_rowsSap Select All RowsA
Select all rows in an ALV grid. Does NOT work on GuiTableControl.
Inputs: grid_id (required). Returns: object
sap_select_all_table_control_columnsSap Select All Table Control ColumnsA
Select or deselect all columns in a GuiTableControl. Does NOT work on ALV grids.
Inputs: table_id (required), select. Returns: object
sap_select_checkboxSap Select CheckboxA
Select or deselect a checkbox on the current SAP screen.
Set selected=false to uncheck. Use sap_get_screen_elements with type_filter='GuiCheckBox' to find checkbox IDs.
Inputs: checkbox_id (required), selected. Returns: object
sap_select_combobox_entrySap Select Combobox EntryA
Select an entry in a combobox/dropdown by its key or display value text.
Accepts either the technical key or the visible display text. Use sap_get_combobox_entries first to see all valid options. F4 opens nothing on a dropdown; sap_set_field selects entries the same way.
Inputs: combobox_id (required), key_or_value (required). Returns: object
sap_select_multiple_rowsSap Select Multiple RowsA
Select multiple rows at once in an ALV grid or table control.
Pass a list of row indices (e.g., [0, 2, 5]).
Inputs: rows (required), table_id (required). Returns: object
sap_select_radio_buttonSap Select Radio ButtonA
Select a radio button on the current SAP screen.
Use sap_get_screen_elements with type_filter='GuiRadioButton' to find radio button IDs on the current screen.
Inputs: radio_id (required). Returns: object
sap_select_tabSap Select TabA
Select a tab in a tab strip control.
Returns screen info after selection (tab content changes). Tab IDs typically look like 'wnd[0]/usr/tabsTABSTRIP/tabpTAB01'.
Inputs: tab_id (required). Returns: object
sap_select_table_rowSap Select Table RowB
Select a row in a table/grid.
Works on both ALV grids and table controls. Row index is zero-based. For ALV: uses absolute row index. For TableControl: scrolls to make the row visible first if needed.
Inputs: row (required), table_id (required). Returns: object
sap_select_tree_nodeSap Select Tree NodeA
Select a node in a tree control.
Highlights the node without opening it. For SPRO-style trees, use sap_click_tree_link on the execute icon column instead.
Inputs: tree_id (required), node_key (required). Returns: object
sap_send_keySap Send KeyA
Press a keyboard key / function key in the SAP window (sendVKey).
Common keys: Enter (confirm), F1 (Help), F3 (Back), F4 (search help / value help), F5 (Refresh), F8 (Execute), F11 (Save), F12 (Cancel/Escape). Also supports Shift+F1..F9 and Ctrl+F, Ctrl+G, Ctrl+P.
A key that is not active on the screen is not sent: the response has an error and available_keys, the keys this screen accepts.
F11 / Save requires user confirmation via elicitation before proceeding; the response then has confirmed_by_user: true. A declined save returns status 'cancelled' with an error.
Inputs: key (required). Returns: object
sap_set_batch_fieldsSap Set Batch FieldsA
Fill in multiple input fields at once (dict of field_id to value).
Use this to fill a form or selection screen in one call — more efficient than repeated sap_set_field calls. Table-control cells work too: take the cell_id template of each column from sap_read_table(columns_only=true) and replace {row}. A dropdown (cmb) takes an entry's key or text, as in sap_set_field.
The result gives counts; results lists only the fields that did NOT
succeed (all of them with verbose=true). Check failed == 0: a field
that was not set does not stop the others. With --strict-errors such a
batch is returned as an error.
Inputs: fields (required), verbose, validate, skip_readonly, +1 more. Returns: object
sap_set_confirmation_pointsSap Set Confirmation PointsARead-only
Choose which SAP operations need the user's explicit approval first.
Replaces this session's set of confirmation points. When a point is active, every matching tool call pauses and asks the user to approve it (MCP elicitation) before anything reaches SAP; declining returns an error and nothing is executed.
Points:
transactions: sap_execute_transaction
batch_fields: sap_set_batch_fields
field_writes: sap_set_field, sap_modify_cell, sap_set_textedit, sap_select_checkbox, sap_select_radio_button, sap_select_combobox_entry
all_writes: every write-tagged tool. Strict and noisy — many write tools only select, scroll or navigate, and they will all prompt. Under all_writes, sap_send_key("F11") asks twice: once for the category and once for the unchanged save gate.
attach: sap_connect_existing lets the user pick the SAP session in a dialog, unless the call names a system with exactly one open session.
'save' (F11 / Save key, Save toolbar button) is always on and cannot be turned off. Points set by the server's --confirm flag cannot be removed either. Adding a point is silent; removing one asks the user first, and a declined removal keeps the point.
Confirmation prompts block until the user answers, and on clients without elicitation support the gated call fails instead of running unconfirmed (same fail-closed rule as the save gate). On such a client points also cannot be removed, so activating one there blocks that whole category for the rest of the session. Call sap_preview before a gated action so the user can see the screen and pending values first.
Inputs: points (required). Returns: object
sap_set_current_cellSap Set Current CellB
Set the current (focused) cell in an ALV grid or table control.
Useful before pressing toolbar buttons that act on the current cell.
Inputs: row (required), column (required), grid_id (required). Returns: object
sap_set_fieldSap Set FieldA
Set (type/enter) a value into an input field on the current SAP screen.
Works on GuiTextField and GuiCTextField input fields, and on dropdowns (GuiComboBox, ID prefix cmb): there value picks the entry by its key or its text, and the response reports the key and text selected. For filling in multiple fields of a form at once, use sap_set_batch_fields instead. After setting a field, you may need to press Enter to trigger validation.
A value longer than the field (MaxLength) or a field that is not changeable is refused before writing: status 'rejected' and an error that says which, and the field keeps its content.
Inputs: value (required), field_id (required). Returns: object
sap_set_focusSap Set FocusA
Set focus to any screen element by its ID.
Some SAP actions require focus on a specific element before they work (e.g., F4 search help on a field). Use this to set focus before sending keys with sap_send_key.
Inputs: element_id (required). Returns: object
sap_set_texteditSap Set TexteditB
Write text into a multiline text editor (GuiTextedit) — long texts, notes, comments, document text.
Inputs: text (required), textedit_id (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 59 tools
Most tools are distinguishable because descriptions explicitly call out element types and restrictions, but there are several overlapping boundaries: sap_get_popup_window vs sap_handle_popup, sap_set_field vs sap_set_batch_fields/sap_select_combobox_entry, and the many ALV/TableControl/tree variants. An agent can usually infer the right tool, but only after reading careful type-specific notes.
Tool names consistently use the sap_ prefix followed by snake_case verb_noun phrasing, such as sap_read_table, sap_press_button, and sap_get_tree_node_children. Variants like ALV and TableControl tools follow predictable naming patterns rather than mixing conventions.
With 59 tools, the surface is far beyond a well-scoped set and includes many micro-variants for tables, trees, popups, and screen discovery. Even for a complex SAP GUI domain, this creates a heavy selection and maintenance burden.
The set covers connection/session management, navigation, field input, tables, trees, popups, lists, screenshots, previews, and confirmation gates, so it is quite complete for SAP GUI automation. Minor gaps remain, and some workflows rely on combinations of many small tools rather than direct lifecycle operations.
Maintenance
Related MCP Connectors
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server that lets your AI assistant build and deploy apps, hosting each one at a live URL.
Cloud-hosted MCP server for secure AI access to enterprise data sources via CData Connect AI.
Related MCP Servers
- FlicenseBqualityNot gradedmaintenanceAn MCP server that enables AI assistants to interact with SAP systems via the ABAP Development Tools (ADT) REST API. It allows users to read ABAP source code, inspect DDIC objects, and execute SQL queries directly.66-
- AlicenseNot gradedqualityNot gradedmaintenanceAn enterprise-grade MCP server that enables AI agents to execute SAP RFC functions and read business data securely through the Model Context Protocol.MIT

dassian-adtofficial
AlicenseNot gradedqualityCmaintenanceMCP server for SAP ABAP development via the ADT API. Connect AI assistants to your SAP system — read, write, test, and deploy ABAP code without SAP GUI.20MIT- AlicenseNot gradedqualityDmaintenanceA production-ready MCP server that enables LLMs to automate SAP GUI using RoboSAPiens, supporting both stdio and SSE modes.14Apache 2.0