{"ref":"artifact:sleibach-cap-mcp-plugin","page":"/artifacts/sleibach-cap-mcp-plugin","json":"/artifacts/sleibach-cap-mcp-plugin.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"sleibach-cap-mcp-plugin","name":"cap-mcp-plugin","artifact_type":"cds-plugin","ecosystem":"cap","domain":"ai-and-agents","origin_ring":"independent","description":{"one_line":"Generates an MCP server from a CDS model: annotated entities become MCP resources, functions and actions become tools, and services can expose reusable prompt templates. A fork of [@gavdi/cap-mcp](artifact:gavdi-cap-mcp) that adds an OAuth proxy, IAS client registration and draft-lifecycle tools.","short":"MCP server generated from a CDS model, forked from @gavdi/cap-mcp","when_not_to_use":"Not published to npm. Install from source.","what_it_solves":"An agent that needs to reach a CAP service has nothing to talk to: the model is in CDS, and giving an MCP client access otherwise means writing and maintaining a second server that restates the entities, their query options and their actions by hand. This plugin derives that server from the CDS model — entities carrying an @mcp annotation become MCP resources that accept OData v4 query options such as $filter, $orderby, $top, $skip and $select, and annotated functions and actions become tools whose parameter schemas come from their signatures. Draft-enabled entities additionally get the draft lifecycle as tools, and @UI.* annotations already on the model render as Fiori list and object pages served back as interactive resources. It is a fork of [@gavdi/cap-mcp](artifact:gavdi-cap-mcp) that adds OAuth per RFC 9728, IAS and approuter deployment, and persists sessions in a CAP entity so multiple instances can serve the same endpoint.","to_build_on_it":"It reads the CDS model at bootstrap and exposes only what carries an @mcp annotation — resource on entities, tool on functions and actions, wrap for CRUD-style wrappers, alongside hint, omit, expand, prompts and apps — so anything left unannotated stays invisible to the client. @mcp.omit filters MCP output only: omitted fields can still be supplied on create and update and remain queryable in the underlying CAP service, so that boundary is worth checking before you lean on it. The server mounts at /mcp over HTTP POST and SSE, auth is either inherit (CAP's configured scheme) or none, and session state goes to the database, to memory, or nowhere. It builds on [@gavdi/cap-mcp](artifact:gavdi-cap-mcp) with the added work concentrated in OAuth, IAS and approuter deployment; the README records elicitation as working for direct tools but not entity wrappers, and the Fiori UI generated from @UI.* annotations needs a host that supports the [MCP Apps extension](https://modelcontextprotocol.io/)."},"links":{"repo":"https://github.com/sleibach/cap-mcp-plugin"},"identity":{"author":"sleibach","license":"Apache-2.0"},"compat":{"runtimes":["node"]},"type_properties":{"distribution":{"value":["npm"],"sources":[{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — README","checked":"2026-10-18","quote":"npm install github:sleibach/cap-mcp-plugin"}]}},"provides":[{"capability":"capability:mcp-servers","facets":[{"key":"mcp_exposure_source","value":["CAP service contract"],"source":{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Annotated entities become MCP resources, functions and actions become tools, and services can expose reusable prompt templates.","checked":"2026-10-12"},"sources":[{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Annotated entities become MCP resources, functions and actions become tools, and services can expose reusable prompt templates.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"CDS operations annotated with `@mcp.tool: true` become MCP tools.","checked":"2026-10-12"}],"applies_to":{"ecosystems":["cap"],"flavors":["node"]}},{"key":"mcp_operations","value":"Queries, bound/unbound operations, configured CRUD and draft lifecycle; draft roots reject direct active-row writes unless bypass is enabled","source":{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Both **unbound** (service-level) and **bound** (entity-level) operations are supported","checked":"2026-10-12"},"sources":[{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Both **unbound** (service-level) and **bound** (entity-level) operations are supported","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"- `delete` — remove a row by key(s).","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"- `draft-activate` — publish the pending draft to the active row.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"**Short-circuits active-row `create`, `update`, and `delete`** with a `DRAFT_REQUIRED` error","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"entities annotated with `@odata.draft.bypass` (or the whole service with `cds.env.fiori.bypass_draft: true`) continue to accept direct active-row `create`/`update`/`delete`","checked":"2026-10-12"}],"applies_to":{"ecosystems":["cap"],"flavors":["node"]}},{"key":"mcp_context","value":["MCP resources","MCP prompts","Schema hints","Interactive UI resources","Server instructions"],"source":{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Declare reusable prompt templates.","checked":"2026-10-12"},"sources":[{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Declare reusable prompt templates.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Enrich schemas for AI agents via `@mcp.hint` on elements and parameters.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"When an entity has `@mcp.wrap.tools` **and** Fiori UI annotations, the plugin registers two `ui://` HTML resources","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Server-level instructions surfaced to agents","checked":"2026-10-12"}],"applies_to":{"ecosystems":["cap"],"flavors":["node"]}},{"key":"mcp_execution_path","value":["CAP service calls"],"source":{"url":"https://raw.githubusercontent.com/sleibach/cap-mcp-plugin/5359398d0662f452d31529509c67634f8eb5406d/lib/mcp/resources.js","title":"sleibach/cap-mcp-plugin — resources.js at 5359398d0662f452d31529509c67634f8eb5406d","quote":"const response = await service.tx({ user: accessRights }).run(query);","checked":"2026-10-12"},"sources":[{"url":"https://raw.githubusercontent.com/sleibach/cap-mcp-plugin/5359398d0662f452d31529509c67634f8eb5406d/lib/mcp/resources.js","title":"sleibach/cap-mcp-plugin — resources.js at 5359398d0662f452d31529509c67634f8eb5406d","quote":"const response = await service.tx({ user: accessRights }).run(query);","checked":"2026-10-12"},{"url":"https://raw.githubusercontent.com/sleibach/cap-mcp-plugin/5359398d0662f452d31529509c67634f8eb5406d/lib/mcp/tools.js","title":"sleibach/cap-mcp-plugin — tools.js at 5359398d0662f452d31529509c67634f8eb5406d","quote":"service.tx({ user: accessRights }).send({","checked":"2026-10-12"}],"applies_to":{"ecosystems":["cap"],"flavors":["node"]}},{"key":"mcp_exposure_control","value":["Entity/operation annotations","Wrapper configuration","Output filtering"],"source":{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"CDS operations annotated with `@mcp.tool: true` become MCP tools.","checked":"2026-10-12"},"sources":[{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"CDS operations annotated with `@mcp.tool: true` become MCP tools.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"modes: ['query', 'get', 'create', 'update']","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"`@mcp.omit` filters MCP output only.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Omitted fields can still be supplied as inputs on create / update operations and remain queryable in the underlying CAP service.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"no Create/Edit/Delete buttons (the write tools themselves are unaffected)","checked":"2026-10-12"}],"applies_to":{"ecosystems":["cap"],"flavors":["node"]}}],"what_it_does":"Generates MCP entity resources and bound/unbound operation tools for CAP [Node.js](external:nodejs), with configured CRUD wrappers, a draft lifecycle and optional Fiori-derived MCP Apps. The README requires [Node.js](external:nodejs) 18+, CAP 9+ and Express 4+. Resource/tool annotations and wrapper modes select the exposed surface; resource reads and direct operation tools call CAP service transactions in the pinned implementation. Entity resources, prompt templates and @mcp.hint schemas supply context, instructions configures server instructions, and MCP Apps require @mcp.wrap.tools with Fiori annotations. @mcp.omit filters output only, and disabling app write buttons leaves tools callable.","sources":[{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"- Node.js 18+","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"- `@sap/cds` 9+","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"- `express` 4+","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"`@mcp.omit` filters MCP output only.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"no Create/Edit/Delete buttons (the write tools themselves are unaffected)","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Annotated entities become MCP resources, functions and actions become tools, and services can expose reusable prompt templates.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"CDS operations annotated with `@mcp.tool: true` become MCP tools.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Both **unbound** (service-level) and **bound** (entity-level) operations are supported","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"- `delete` — remove a row by key(s).","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"- `draft-activate` — publish the pending draft to the active row.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"**Short-circuits active-row `create`, `update`, and `delete`** with a `DRAFT_REQUIRED` error","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"entities annotated with `@odata.draft.bypass` (or the whole service with `cds.env.fiori.bypass_draft: true`) continue to accept direct active-row `create`/`update`/`delete`","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Declare reusable prompt templates.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Enrich schemas for AI agents via `@mcp.hint` on elements and parameters.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"When an entity has `@mcp.wrap.tools` **and** Fiori UI annotations, the plugin registers two `ui://` HTML resources","checked":"2026-10-12"},{"url":"https://raw.githubusercontent.com/sleibach/cap-mcp-plugin/5359398d0662f452d31529509c67634f8eb5406d/lib/mcp/resources.js","title":"sleibach/cap-mcp-plugin — resources.js at 5359398d0662f452d31529509c67634f8eb5406d","quote":"const response = await service.tx({ user: accessRights }).run(query);","checked":"2026-10-12"},{"url":"https://raw.githubusercontent.com/sleibach/cap-mcp-plugin/5359398d0662f452d31529509c67634f8eb5406d/lib/mcp/tools.js","title":"sleibach/cap-mcp-plugin — tools.js at 5359398d0662f452d31529509c67634f8eb5406d","quote":"service.tx({ user: accessRights }).send({","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"modes: ['query', 'get', 'create', 'update']","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Omitted fields can still be supplied as inputs on create / update operations and remain queryable in the underlying CAP service.","checked":"2026-10-12"},{"url":"https://github.com/sleibach/cap-mcp-plugin","title":"cap-mcp-plugin — sleibach/cap-mcp-plugin README","quote":"Server-level instructions surfaced to agents","checked":"2026-10-12"}]}],"provenance":{"discovered_via":[{"source":"source:github","channel":"sleibach"}],"first_seen":"2026-08-31","claimed_by":"actor:sleibach"},"maintainers":["actor:sleibach"],"alternative_to":["artifact:cap-js-mcp","artifact:gavdi-cap-mcp"],"drafted_with_ai":true,"history":[{"date":"2026-10-12","field":"provides[mcp-servers].facets and what_it_does","from":"[{\"key\":\"mcp_exposure_source\",\"value\":\"Annotated CDS model\"},{\"key\":\"mcp_operations\",\"value\":\"Queries/actions, configured CRUD and draft lifecycle\"},{\"key\":\"mcp_context\",\"value\":\"Entity resources, prompt templates and interactive MCP Apps resources\"}]","to":"[{\"key\":\"mcp_exposure_source\",\"value\":\"Annotated CDS entities and bound/unbound operations in a CAP application\"},{\"key\":\"mcp_operations\",\"value\":\"Queries, bound/unbound operations, configured CRUD and draft lifecycle; draft roots reject direct active-row writes unless bypass is enabled\"},{\"key\":\"mcp_context\",\"value\":\"Entity resources, prompt templates, @mcp.hint schemas and optional MCP Apps from Fiori annotations\"},{\"key\":\"mcp_execution_path\",\"value\":\"Resource reads and direct operation tools call CAP service transactions (pinned implementation)\"},{\"key\":\"mcp_exposure_control\",\"value\":\"Resource/tool annotations and wrapper modes select the surface; @mcp.omit filters output only; disabling app write buttons leaves tools callable\"}]","reason":"The comparison distinguishes execution and surface selection at the stated runtime, retaining conditional operations and target restrictions."},{"date":"2026-10-12","field":"provides.mcp-servers.facets.mcp_exposure_source.value","from":"Annotated CDS entities and bound/unbound operations in a CAP application","to":"CAP service contract","reason":"Converts the text answer to controlled list values. Its documented conditions remain in the capability relationship; original citations and runtime scope are retained."},{"date":"2026-10-12","field":"provides.mcp-servers.facets.mcp_context.value","from":"Entity resources, prompt templates, @mcp.hint schemas and optional MCP Apps from Fiori annotations","to":"MCP resources; MCP prompts; Schema hints; Interactive UI resources; Server instructions","reason":"Converts the text answer to controlled list values. Its documented conditions remain in the capability relationship; original citations and runtime scope are retained."},{"date":"2026-10-12","field":"provides.mcp-servers.facets.mcp_execution_path.value","from":"Resource reads and direct operation tools call CAP service transactions (pinned implementation)","to":"CAP service calls","reason":"Converts the text answer to controlled list values. Its documented conditions remain in the capability relationship; original citations and runtime scope are retained."},{"date":"2026-10-12","field":"provides.mcp-servers.facets.mcp_exposure_control.value","from":"Resource/tool annotations and wrapper modes select the surface; @mcp.omit filters output only; disabling app write buttons leaves tools callable","to":"Entity/operation annotations; Wrapper configuration; Output filtering","reason":"Converts the text answer to controlled list values. Its documented conditions remain in the capability relationship; original citations and runtime scope are retained."},{"date":"2026-10-12","field":"provides[mcp-servers].what_it_does","from":"Generates MCP entity resources and bound/unbound operation tools for CAP [Node.js](external:nodejs), with configured CRUD wrappers, a draft lifecycle and optional Fiori-derived MCP Apps. The README requires [Node.js](external:nodejs) 18+, CAP 9+ and Express 4+. Output omission and disabling app write buttons do not disable the underlying operation tools. Resource/tool annotations and wrapper modes select the exposed surface. Resource reads and direct operation tools call CAP service transactions in the pinned implementation. Entity resources, prompt templates and @mcp.hint schemas supply context; instructions configures server instructions. MCP Apps require @mcp.wrap.tools and Fiori annotations. @mcp.omit filters output only, and disabling app write buttons leaves tools callable.","to":"Generates MCP entity resources and bound/unbound operation tools for CAP [Node.js](external:nodejs), with configured CRUD wrappers, a draft lifecycle and optional Fiori-derived MCP Apps. The README requires [Node.js](external:nodejs) 18+, CAP 9+ and Express 4+. Resource/tool annotations and wrapper modes select the exposed surface; resource reads and direct operation tools call CAP service transactions in the pinned implementation. Entity resources, prompt templates and @mcp.hint schemas supply context, instructions configures server instructions, and MCP Apps require @mcp.wrap.tools with Fiori annotations. @mcp.omit filters output only, and disabling app write buttons leaves tools callable.","reason":"Resolves the requested review findings while preserving the structured comparison values, runtime scopes and implementation restrictions."}]},"effective_normative_relations":[{"instrument":"instrument:sap-developer-license-3-2-cap","relation":"use-constrained-by","sections":["1","2","3"],"applies_when":"A cds-plugin is used with SAP CAP materials, or an artifact is explicitly identified as a CAP plugin or application.","note":"This is inherited applicability, not a licence verdict about the artifact itself. Review the agreement for the actual materials and use; an explicit artifact relationship to another revision takes precedence.","scope":{"kind":"artifact"},"sources":[{"url":"https://cap.cloud.sap/resources/license/developer-license-3_2_CAP.txt","title":"SAP Developer License Agreement 3.2 CAP","checked":"2026-09-16","quote":"documentation, plug-ins, templates, scripts and sample code, libraries, software development kits"}],"inherited_from":"cap-plugins-and-applications","relevant_capabilities":["agent-systems-access","async-processing","data-import-export","database-connectors","deployment","destinations","llm-integration","mcp-servers","plugin-authoring","replication","retrieval-augmented-generation","rfc-connectivity"]}],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"one contributor, personally owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-06, not archived"}],"compatibility":[{"label":"Declared for","tier":"fair","evidence":"nothing declared"},{"label":"Survived majors","tier":"unknown","evidence":"no release dates"},{"label":"Maintainer's CI","tier":"fair","evidence":"no CI configured"}],"practice":[{"label":"Tests","tier":"good","evidence":"82 test files"},{"label":"Docs","tier":"good","evidence":"docs/ with 1 page, README 38 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":7,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-24","npm":"not published under this name","stars":7,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2026-06-13","license_spdx":null,"org_owned":false,"default_branch":"main","contributors":0,"tree_truncated":false,"test_files":82,"workflows":0,"other_ci":false,"readme_bytes":39233,"docs_files":1,"changelog":false,"license_file":true,"dts_files":0,"readme_path":"README.md","readme_sha":"3b438b584296e089087ab78c6455f52c77b90e29","created_at":"2025-11-04T08:09:32Z","open_prs":0,"first_commit":"2025-11-04","last_commit":"2026-06-13","commits":54,"repo_read":"2026-10-24"},"edges":{"maintainers":[{"ref":"actor:sleibach","name":"Sören Leibach","json":"/actors/sleibach.json"}],"contributors":[],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}