Skip to main content
Glama
xiaoliang2

dsh-abap-mcp

by xiaoliang2

dsh-abap-mcp

⚠️ 실험 단계 · EXPERIMENTAL

이 플러그인은 아직 실험 단계(Experimental)이며, 개발/테스트(Dev/Test) 환경 전용입니다.

  • 프로덕션 시스템에 직접 연결하지 마십시오. 기본적으로 읽기 전용이라 하더라도, 읽기 전용 도구로도 프로덕션 시스템의 소스 코드와 비즈니스 데이터를 읽을 수 있습니다.

  • 최소 권한(least-privilege)의 SAP 계정으로 연결하십시오.

  • 쓰기 권한 스위치(sourceWrite / transports / refactor / exec / git / debug / serviceBinding)는 기본적으로 모두 꺼져 있으며, 개발 시스템에서만 필요에 따라 신중하게 켜십시오.

  • 비밀번호는 로컬 settings.yaml에 평문으로 기록되므로, 자격 증명 보안에 유의하십시오.

이 플러그인을 사용하면 위험을 인지하고 그 결과를 스스로 부담하는 것으로 간주됩니다.

DeepSeek Harness 플러그인: MCP를 통해 SAP ABAP ADT에 연결하여, DSH 내에서 SAP의 ABAP 객체를 직접 조회/열람합니다. 기본적으로 엄격한 읽기 전용이며, 7가지 쓰기 권한은 구성 가능한 스위치로 제공됩니다.

업스트림 서버: mario-andreschak/mcp-abap-abap-adt-api 이 플러그인은 server/ 안에 권한 계층이 추가된 서버 사본(기본 읽기 전용 + 스위치)을 내장하고 있으며, 연결, 도구 등록, 설정 변경 시 재연결을 담당합니다.


아키텍처

DSH 设置页卡片(ABAP MCP)
        │  settingsScope.set(...)   ←→  settings/updated
        ▼
Host 插件 lib/index.js
  1. settings.register("abap-mcp", schema)   # 连接配置 + 7 类权限开关 + 状态
  2. spawn `node server/dist/index.js`(StdioClientTransport,env=SAP_* + MCP_ABAP_PERMISSIONS)
  3. MCP Client 连接,把服务器工具注册为 mcp__abap__<tool>
  4. 配置变更 → 去抖重连;连接断开 → 有界退避重试
        ▼
server/dist/index.js(MCP 服务器,权限在这里强制生效)
  - MCP_ABAP_PERMISSIONS 未设置 → 默认只读(约 75 个只读工具)
  - 7 类写权限通过 MCP_ABAP_PERMISSIONS 的 JSON 开关启用
  • 권한의 단일 진실 공급원은 서버 측에 있습니다: Host는 스위치 값을 서버에 전달만 할 뿐, 도구 목록과 호출은 모두 권한에 따라 필터링/거부됩니다. 누군가 DSH를 우회하여 서버에 직접 연결하더라도 권한은 여전히 적용됩니다.

  • 도구 명명: mcp__abap__<도구명>(예: mcp__abap__searchObject).

Related MCP server: abap-adt-mcp

권한 모델(기본 = 엄격한 읽기 전용)

권한 모델은 서버 측에서 강제됩니다(server/src/permissions.ts → dist/permissions.js). 기본 읽기 전용 코어는 항상 켜져 있으며, 7가지 쓰기 권한은 기본적으로 모두 꺼져 있고 MCP_ABAP_PERMISSIONS 환경 변수를 통해 카테고리별로 켤 수 있습니다. 등록되지 않은 모든 도구는 일괄 거부(deny-by-default)되므로, 새로 추가된 handler가 조용히 권한을 열어주지 않습니다.

읽기 전용 코어(약 75개 도구, 항상 켜짐)

하위 그룹

도구

설명

인증 / 세션

login logout dropSession

로그인 / 로그아웃 / 로컬 세션 캐시 삭제

객체 검색

objectStructure searchObject findObjectPath objectTypes reentranceTicket

객체 구조 조회 / 검색 / 경로 찾기 / 객체 유형 / 재진입 티켓

클래스 내부 구조

classIncludes classComponents

클래스의 include 구성 / 컴포넌트 목록

코드 분석(읽기 전용)

syntaxCheckCode syntaxCheckCdsUrl codeCompletion findDefinition usageReferences syntaxCheckTypes codeCompletionFull codeCompletionElement usageReferenceSnippets fixProposals fixEdits fragmentMappings abapDocumentation

구문 검사 / 자동 완성 / 정의 이동 / 참조 조회 / 수정 제안 / 문서(읽기 전용)

소스 코드 읽기

getObjectSource

객체 소스 코드 읽기

비활성 객체

inactiveObjects

비활성화된 객체 목록

등록 / 검증

objectRegistrationInfo validateNewObject

객체 등록 정보 / 새 객체 매개변수 검증(읽기 전용)

전송 읽기

transportInfo hasTransportConfig transportConfigurations getTransportConfiguration userTransports transportsByConfig systemUsers transportReference

전송 요청 정보 / 사용자 전송 / 구성 / 시스템 사용자(읽기 전용)

저장소 탐색

nodeContents mainPrograms

객체 트리 탐색 / include 메인 프로그램

기능 / 검색

featureDetails collectionFeatureDetails findCollectionByUrl loadTypes adtDiscovery adtCoreDiscovery adtCompatibiliyGraph

ADT 기능 검색 / 특성 조회

단위 테스트 결과 읽기

unitTestEvaluation unitTestOccurrenceMarkers

단위 테스트 결과 평가 / 마커 위치(읽기 전용)

포맷터 설정 읽기

prettyPrinterSetting

포맷터 설정 읽기(수정하지 않음)

Git 읽기

gitRepos gitExternalRepoInfo checkRepo remoteRepoInfo

저장소 목록 / 원격 정보 / 확인(읽기 전용)

DDIC 읽기

annotationDefinitions ddicElement ddicRepositoryAccess packageSearchHelp

어노테이션 / DDIC 요소 / 패키지 검색(읽기 전용)

서비스 바인딩 상세

bindingDetails

서비스 바인딩 상세(읽기 전용)

데이터 읽기

tableContents runQuery

테이블 데이터 / SQL 쿼리(읽기 전용)

Feeds / Dumps

feeds dumps

동적 객체 목록 / 짧은 덤프(dump) 목록

이름 변경 분석

renameEvaluate renamePreview

이름 변경 평가 / 미리보기(실행만 하고 저장하지 않음)

ATC 읽기

atcCustomizing atcCheckVariant atcWorklists atcUsers isProposalMessage atcContactUri

ATC 검사 구성 / 변형 / 작업 목록 / 사용자 / 연락처(읽기 전용)

추적 읽기

tracesList tracesListRequests tracesHitList tracesDbAccess tracesStatements

추적 목록 / 요청 / 히트 / DB 액세스 / 문장(읽기 전용)

개정 / 상태

revisions healthcheck

객체 개정 이력 / 연결 상태 확인

7가지 쓰기 권한(기본 모두 꺼짐)

스위치

하위 분류

도구

설명

sourceWrite

소스 코드 쓰기

setObjectSource deleteObject activateObjects activateByName createObject createTestInclude lock unLock

소스 코드 쓰기 / 객체 삭제 / 활성화 / 객체 생성 / 테스트 include 생성 / 잠금 및 잠금 해제

transports

전송 요청

createTransport setTransportsConfig createTransportsConfig transportDelete transportRelease transportSetOwner transportAddUser

생성 / 구성 / 삭제 / 릴리스 / 담당자 변경 / 사용자 추가

refactor

리팩토링

renameExecute extractMethodEvaluate extractMethodPreview extractMethodExecute prettyPrinter setPrettyPrinterSetting

이름 변경 실행 / 메서드 추출(평가/미리보기/실행) / 포맷팅(읽기/쓰기)

exec

실행류

runClass unitTestRun

ABAP 클래스 실행 / 단위 테스트 실행

ATC 쓰기 작업

createAtcRun atcExemptProposal atcRequestExemption atcChangeContact

ATC 검사 시작 / 면제 제안 / 면제 요청 / 담당자 변경

추적 구성

tracesSetParameters tracesCreateConfiguration tracesDeleteConfiguration tracesDelete

추적 파라미터 설정 / 구성 생성 / 구성 삭제 / 레코드 삭제

git

Git 쓰기 작업

gitCreateRepo gitPullRepo gitUnlinkRepo stageRepo pushRepo switchRepoBranch

저장소 생성 / 풀 / 링크 해제 / 스테이징 / 푸시 / 브랜치 전환

debug

디버깅

debuggerListeners debuggerListen debuggerDeleteListener debuggerSetBreakpoints debuggerDeleteBreakpoints debuggerAttach debuggerSaveSettings debuggerStackTrace debuggerVariables debuggerChildVariables debuggerStep debuggerGoToStack debuggerSetVariableValue

리스너 / 중단점 / 연결 / 단계 실행 / 스택 / 변수 읽기/쓰기

serviceBinding

서비스 바인딩

publishServiceBinding unPublishServiceBinding

OData 서비스 바인딩 게시 / 게시 취소

설명: 읽기 전용 코어의 「ATC 읽기」「추적 읽기」「Git 읽기」「전송 읽기」는 읽기만 가능합니다. 해당 분류의 쓰기 도구(검사 시작, 구성 변경, 코드 푸시, 서비스 게시 등)는 권한이 있어야 합니다. 이름 변경 전 미리보기(renameEvaluate/renamePreview)는 읽기 전용이며, 실제 실행(renameExecute)만 refactor 권한이 필요합니다.

권한 수동 확인(AI가 스스로 권한을 켜는 것 방지)

임의의 권한 스위치를 켤 때, 플러그인은 수동 확인을 요구합니다: 설정 페이지 카드에서 체크 시 일회성 확인 자격 증명(confirm-<타임스탬프>-<난수>)이 생성되어 구성에 기록되며, Host 측은 자격 증명이 유효(60초 이내)하고 형식이 올바른 경우에만 해당 모드로 연결을 허용합니다. 그렇지 않으면 강제로 읽기 전용으로 전환되고 상태에 「설정 카드에서 수동 확인 필요」가 표시됩니다. 이 메커니즘은 전체 7개 권한 스위치(sourceWrite / transports / refactor / exec / git / debug / serviceBinding)에 동일하게 적용됩니다.

  • 설정 페이지 카드를 통해서만 권한을 켤 수 있습니다. settings API / settings.yaml 직접 수정 / 대화에서 모델이 permissions를 수정하는 방식으로 켜면 유효한 자격 증명이 없어 거부됩니다.

  • 자격 증명은 60초의 유효 기간이 있으며, 재시작 후 자동으로 만료되므로 카드에서 다시 조작해야 합니다.

  • 모든 권한 끄기(전체 꺼짐으로 복귀)는 확인이 필요 없으며 항상 허용됩니다.

설치

npm(정식 패키지)에서

dsh plugin add @xiaobanli/dsh-abap-mcp

로컬 디렉터리(개발/연동)

profile의 package.json에 의존성을 추가하고 pnpm install을 실행합니다:

{
  "dependencies": {
    "@xiaobanli/dsh-abap-mcp": "link:C:/othersoftware/harness/harness/project6/dsh-abap-mcp"
  },
  "dsh": { "profile": { "bundles": [ "...", "dsh-abap-mcp" ] } }
}

DSH를 재시작하면 설정 페이지 왼쪽에 「ABAP MCP」 카드가 나타납니다.

구성(설정 페이지 카드)

사전 준비(연결 전 확인)

  1. SAP 측에서 트랜잭션 코드 SICF에서 ADT 서비스 노드를 활성화해야 합니다: 플러그인은 ABAP Development Tools (ADT)의 HTTP(S) 서비스를 통해 SAP에 접속하므로, 관련 ADT 서비스 노드가 활성화되지 않으면 연결이 실패합니다. 일반적으로 SICF에서 default_host/sap/bc/adt 및 하위 노드를 활성화하면 됩니다(구체적인 노드는 시스템 버전에 따라 약간 다릅니다).

  2. SAP 주소 형식: 대부분 http://주소:포트 또는 https://주소:포트입니다(일부 상위 버전/게이트웨이 구성은 http://주소:포트/sap/bc/adt 전체 경로). 실제 시스템에 따라 프로토콜과 포트를 확인하세요(예: http://10.0.0.1:8000 또는 https://sap.example.com:44300).

필드

설명

연결 활성화

전체 스위치; 꺼짐 시 연결하지 않고 어떤 도구도 등록하지 않음

SAP 주소

예: http://주소:포트 / https://주소:포트(먼저 ADT 서비스 활성화 필요)

사용자 이름 / 비밀번호

연결 자격 증명

클라이언트 / 언어

예: 000 / EN

7개 쓰기 권한 스위치

체크 시 해당 쓰기 기능 활성화

저장 후 Host가 자동으로 재연결됩니다. 대화에서 모델에게 abap_mcp_status를 직접 물어 연결 상태를 확인할 수도 있습니다.

「연결 테스트」 버튼: 먼저 현재 폼을 디스크에 저장한 후, 현재 구성으로 실제 spawn→연결→도구 열거→연결 해제를 한 번 수행하며, 결과(성공/실패, 소요 시간, 도구 수)가 버튼 옆에 표시됩니다. 「연결 활성화」 스위치 상태는 변경하지 않습니다.

  • SAP 주소 / 사용자 이름 / 비밀번호를 입력하지 않은 경우 버튼이 바로 「구성을 먼저 입력하세요」를 표시하며 빈 테스트를 실행하지 않습니다.

  • 테스트 진행 중에는 버튼이 「테스트 중…」으로 표시됩니다. 60초 내에 결과가 없으면 자동으로 타임아웃 처리되고 알림이 표시됩니다.

  • 테스트 결과(status.lastTest)는 버튼 옆에 계속 표시되며, 재연결 상태 새로고침으로 지워지지 않습니다.

  • 테스트는 일회성 동작입니다: 영구 연결이나 자동 재연결을 트리거하지 않으며, 테스트 실패 시 백오프 재시도도 하지 않습니다. 영구 연결과 유한 재연결(최대 5회 후 포기)은 구성 변경(활성화 스위치/연결 필드/권한) 시에만 트리거됩니다.

서버 빌드(server/ 수정 후)

cd server
npm install --ignore-scripts   # 依赖均为纯 JS,无需生命周期脚本
node node_modules/typescript/bin/tsc -p tsconfig.json   # 产出 dist/

문제 해결(Troubleshooting)

「연결 테스트」가 계속 「테스트 중…」으로 표시되거나, 클릭해도 반응이 없음

  • 대부분 설정 쓰기가 디스크에 저장되지 않은 경우입니다. SAP 주소 / 사용자 이름 / 비밀번호가 모두 입력되었는지 확인하세요. 플러그인은 설정을 로컬 settings.yaml에 다시 기록합니다.

  • 반복적으로 멈추는 경우 DSH 로그에 SettingsConflictError(설정 revision 충돌로 쓰기가 버려짐)가 있는지 확인하세요. DSH를 재시작한 후 다시 시도하세요.

연결 시 McpError: Connection closed 오류

  • 데스크톱 버전 호스트는 Electron에서 실행되므로, 하위 프로세스는 Node 모드로 시작해야 합니다(플러그인이 자동으로 ELECTRON_RUN_AS_NODE=1 설정).

  • 그래도 발생하면 server/dist/index.js가 존재하는지 확인하세요(server/ 소스 코드를 수정하지 않았다면 재빌드 불필요). node server/dist/index.js를 직접 실행했을 때 터미널에서 대기 상태가 되면 서버 자체는 정상입니다.

특정 쓰기 권한 스위치를 켰는데 해당 도구가 나타나지 않음

  • 권한의 실제 적용 지점은 서버 측입니다. 스위치 저장 후 플러그인은 재연결하고 도구를 다시 열거합니다(도구 수가 증가해야 함, 예: 75 → 83).

  • 권한 읽기 전용 도구 수가 변하지 않으면 abap_mcp_status의 mode가 read-only + <카테고리>로 변경되었는지 확인하세요. 여전히 read-only라면 스위치가 저장되지 않은 것입니다.

server/ 소스 코드를 수정했는데 도구 동작이 변하지 않음

  • 재빌드가 필요합니다: cd server && npm install --ignore-scripts && node node_modules/typescript/bin/tsc -p tsconfig.json, 그런 다음 DSH를 재시작하여 플러그인이 새 dist/를 사용하도록 하세요.

실행 중 ABAP에서 STRING_OFFSET_TOO_LARGE 등의 오류 발생

  • 이러한 오류는 SAP 측에서 읽히거나 실행되는 ABAP 프로그램 자체에서 발생하는 것으로 플러그인과 무관합니다. mcp__abap__dumps로 단축 덤프 상세 정보를 확인하거나 SE38에서 해당 프로그램을 수정하세요.

보안 설명

  • 읽기 전용 ≠ 무해: 읽기 전용 도구도 프로덕션 시스템의 소스 코드와 비즈니스 데이터를 읽을 수 있습니다. 개발/테스트 시스템에 연결하고 최소 권한 계정을 사용할 것을 강력히 권장합니다(권한 스위치는 DSH 측의 안전장치일 뿐, SAP 측의 권한을 대체하지 않습니다).

  • 서버는 시작 시 권한 모드와 "개발/테스트 시스템 전용 사용 권장" 알림을 출력합니다(권장 + 알림이며 강제가 아닙니다).

  • 비밀번호는 평문으로 로컬 settings.yaml에 기록됩니다(DSH의 settings 서비스가 영속화). 더 높은 보안 수준이 필요하면 직접 credentials 서비스 저장소로 확장하세요.

  • 서버 하위 프로세스는 SDK 화이트리스트 환경 변수 + 본 플러그인이 명시적으로 주입한 SAP_* 및 MCP_ABAP_PERMISSIONS만 상속하며, 호스트의 나머지 환경 변수는 유출되지 않습니다.

License

MIT. 서버 부분의 저작권은 원저작자 mario-andreschak(MIT)에게 있으며, 본 플러그인은 그 위에 권한 계층을 추가했습니다.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants like Claude Code to directly connect to SAP ABAP systems via the ADT REST API with read/write capabilities, featuring AI-friendly high-level tools and built-in safety measures such as read-only mode, prefix whitelisting, and automatic locking.
    9
    396 npm
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to read, write, activate, and transport ABAP code in SAP systems via ABAP ADT REST API, without needing SAP GUI.
    24
    396 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to work with SAP ABAP systems through the ADT REST API, supporting repository search, source code read/write, activation, syntax checks, and transport request management.
    1
    Apache 2.0