{"ref":"artifact:costinggeek-sap-mcp","page":"/artifacts/costinggeek-sap-mcp","json":"/artifacts/costinggeek-sap-mcp.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"costinggeek-sap-mcp","name":"CostingGeek/sap-mcp","artifact_type":"mcp-server","ecosystem":"btp","use_as":"starting-point","domain":"ai-and-agents","origin_ring":"independent","description":{"one_line":"A Python server that fetches sales orders from SAP's business data graph and hands them to Claude Desktop — the only entry here pointed at that API rather than at one system's own services.","short":"Python MCP server fetching sales orders from SAP's business data graph","what_it_solves":"SAP's business data graph is the one API surface on this capability that nothing else here touches: every neighbour speaks OData against a single system, this speaks one composed API across the landscape. The README calls it the SAP Graph API, which is what SAP called it until 2026-07-06; the capability is [API Composition](artifact:btp-api-composition) now, and SAP's own entry says the features are unchanged. What exists is one entity's worth: sales orders retrieved with an API key against the sandbox host the tool has hard-coded, wired into Claude Desktop as a stdio server with one tool.","to_build_on_it":"Extending it to customers, products and the rest is named in the README as the intended next step, and the shape is a few lines per entity. Under 10 KB and untouched since April 2025, so this is a worked example of reaching that API rather than something to depend on — the value is that it shows the API key, the endpoint and the wiring in one readable file."},"links":{"repo":"https://github.com/CostingGeek/sap-mcp"},"identity":{"license":"MIT"},"provides":[{"capability":"capability:agent-systems-access","what_it_does":"Reaches SAP's composed business data graph rather than a system's own OData services — the only entry in this corner that does — and returns business data to an assistant from it.","sources":[{"url":"https://github.com/CostingGeek/sap-mcp","title":"CostingGeek/sap-mcp — repository description","checked":"2026-09-27","quote":"An MCP server to retrieve information like Sales Orders from the SAP Graph API Sandbox"}]}],"connects":[{"ref":"artifact:btp-api-composition","kind":"data","protocols":["http"],"direction":"outbound","style":"sync","for":"Its one tool issues an HTTPS GET for sales orders against the sandbox host of SAP's business data graph, with the key in an apikey header and six fields named in the query.","sources":[{"url":"https://github.com/CostingGeek/sap-mcp","title":"CostingGeek/sap-mcp — README, How It Works","checked":"2026-09-27","quote":"The function connects to SAP Graph API and returns formatted results"},{"url":"https://github.com/CostingGeek/sap-mcp/blob/main/saptools.py","title":"CostingGeek/sap-mcp — saptools.py","checked":"2026-09-27","quote":"API_URL = \"https://sandbox.api.sap.com/sapgraph/sap.graph/SalesOrder\""}]}],"provenance":{"discovered_via":[{"source":"source:sap-ai-mcp-servers"}],"first_seen":"2026-09-10"},"history":[{"date":"2026-09-10","field":"entry","from":null,"to":"created","reason":"Triaged out of data/crawled/mcp-candidates.json, the sap-ai-mcp-servers sweep. Written from the repository's own README; the catalogue is credited as where it was found and its words are not reused."},{"date":"2026-09-27","field":"description","from":"named SAP Graph as the current name of the API this reaches","to":"names API Composition, with the rename dated and the repository's own wording placed","reason":"SAP's What's New for API Composition dates the rename of the Graph capability to 2026-07-06 and says the features are unchanged. The repository still says SAP Graph, which is the maintainer's word and stays in the quotes; the atlas's own sentences named a name SAP had retired."},{"date":"2026-09-27","field":"connects","from":null,"to":"artifact:btp-api-composition","reason":"The whole entry rested on an API the graph did not hold, so the prose named it and no edge pointed at it. The README's How It Works step and the hard-coded sandbox URL in saptools.py state the connection."},{"date":"2026-09-27","field":"type_properties","from":null,"to":"runs, transports, auth","reason":"Read from the README and from saptools.py, which were the entry's sources from the start and state all three: the Claude Desktop config launches it from a local directory, the server runs on stdio, and the key travels in an apikey header. tool_count is left out — the README enumerates one tool and states no number, and the field rests on a stated count elsewhere in the corpus."},{"date":"2026-10-09","field":"provides","from":"capability:mcp-servers","to":"capability:agent-systems-access","reason":"The concern it answers is reaching into an SAP system from outside, split out of MCP servers on this day; the sentence on the edge is unchanged."}],"type_properties":{"runs":{"value":["local-process"],"sources":[{"url":"https://github.com/CostingGeek/sap-mcp","title":"CostingGeek/sap-mcp — README, Connect Claude Desktop with the MCP Server","checked":"2026-09-27","quote":"\"command\": \"uv\","},{"url":"https://github.com/CostingGeek/sap-mcp","title":"CostingGeek/sap-mcp — README, Connect Claude Desktop with the MCP Server","checked":"2026-09-27","quote":"Edit the file `claude_desktop_config.json` usually located in the %APPDATA%\\Claude folder."}]},"transports":{"value":["stdio"],"sources":[{"url":"https://github.com/CostingGeek/sap-mcp/blob/main/saptools.py","title":"CostingGeek/sap-mcp — saptools.py","checked":"2026-09-27","quote":"mcp.run(transport='stdio')"}]},"auth":{"value":["api-key"],"sources":[{"url":"https://github.com/CostingGeek/sap-mcp","title":"CostingGeek/sap-mcp — README, Get the SAP API Key","checked":"2026-09-27","quote":"Save that API key as system environment variable \"SAP_API_KEY\"."},{"url":"https://github.com/CostingGeek/sap-mcp/blob/main/saptools.py","title":"CostingGeek/sap-mcp — saptools.py","checked":"2026-09-27","quote":"\"apikey\": SAP_API_KEY,  # Key name must be \"apikey\" (lowercase)"}]}},"drafted_with_ai":true,"maintainers":["actor:costinggeek"],"contributors":["actor:costinggeek"]},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"one contributor, personally owned"},{"label":"Repository","tier":"fair","evidence":"pushed 2025-04, 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":"fair","evidence":"no CI configured"}],"practice":[{"label":"Tests","tier":"fair","evidence":"none found in the tree"},{"label":"Docs","tier":"good","evidence":"README 5 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":6,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-24","npm":"not published under this name","stars":6,"forks":1,"open_issues":0,"archived":false,"pushed_at":"2025-04-28","license_spdx":"MIT","org_owned":false,"default_branch":"main","contributors":1,"tree_truncated":false,"test_files":0,"workflows":0,"other_ci":false,"readme_bytes":5358,"docs_files":0,"changelog":false,"license_file":true,"dts_files":0,"readme_path":"README.md","readme_sha":"6046bea60f9d6cd8b0da6f35e71c5630a599287d","created_at":"2025-04-28T00:54:47Z","open_prs":0,"first_commit":"2025-04-28","last_commit":"2025-04-28","commits":4,"repo_read":"2026-10-24"},"edges":{"maintainers":[{"ref":"actor:costinggeek","name":"CostingGeek","json":"/actors/costinggeek.json"}],"contributors":[{"ref":"actor:costinggeek","name":"CostingGeek","json":"/actors/costinggeek.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}