{"_id":"@babamba2/mcp-abap-connection","name":"@babamba2/mcp-abap-connection","dist-tags":{"latest":"1.5.3"},"versions":{"1.5.3":{"name":"@babamba2/mcp-abap-connection","version":"1.5.3","description":"ABAP connection layer for MCP ABAP ADT server (fork of @mcp-abap-adt/connection by fr0ster)","main":"dist/index.js","types":"dist/index.d.ts","bin":{"sap-abap-auth":"bin/sap-abap-auth.js"},"keywords":["abap","sap","adt","connection","mcp","abap-adt"],"author":{"name":"babamba2","email":"psspss1122@gmail.com"},"contributors":[{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com","url":"original author"}],"license":"MIT","homepage":"https://github.com/babamba2/mcp-abap-connection#readme","bugs":{"url":"https://github.com/babamba2/mcp-abap-connection/issues"},"repository":{"type":"git","url":"git+https://github.com/babamba2/mcp-abap-connection.git"},"publishConfig":{"access":"public"},"scripts":{"chrono":"./tools/version-stats.sh","clean":"rm -rf dist tsconfig.tsbuildinfo","lint":"npx biome check --write src","lint:check":"npx biome check src","format":"npx biome format --write src","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","build:fast":"npx tsc -p tsconfig.json","test":"jest","prepublishOnly":"npm run build:fast"},"engines":{"node":">=18.0.0"},"dependencies":{"@babamba2/mcp-abap-adt-interfaces":"^3.1.0","axios":"^1.13.5","commander":"^14.0.3","express":"^5.1.0","open":"^11.0.0"},"devDependencies":{"@biomejs/biome":"^2.3.14","@types/jest":"^30.0.0","@types/node":"^25.2.3","jest":"^30.2.0","jest-util":"^30.2.0","ts-jest":"^29.2.5","typescript":"^5.9.2"},"gitHead":"7b23bcec654f15c400a14c48ad04b4768166ca00","_id":"@babamba2/mcp-abap-connection@1.5.3","_nodeVersion":"24.13.1","_npmVersion":"11.8.0","dist":{"integrity":"sha512-VUgsG3iGSScmGCU9wrMyAyNVEIs2qMkdm2CLfZZk7JmBperG6PEsMYYuzFJpW1hw1EPbxTju78yJpvsT3kiT2Q==","shasum":"3cca2eb1f3a5c476cb928fda1cd61d22e6a0886e","tarball":"https://registry.npmjs.org/@babamba2/mcp-abap-connection/-/mcp-abap-connection-1.5.3.tgz","fileCount":46,"unpackedSize":140378,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAjj96ymmwIhNQQzpw/UWZjtXE7ALd0hNIOK6MZS+anlAiEAqmOijiO89MlZF2TUIWZ3VUpfc3hNIKYMufH8cB+Yla8="}]},"_npmUser":{"name":"psspss1122","email":"psspss1122@gmail.com"},"directories":{},"maintainers":[{"name":"psspss1122","email":"psspss1122@gmail.com"},{"name":"s2hoon326","email":"s2hoon326@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-abap-connection_1.5.3_1776491097464_0.014620648214909826"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-18T05:44:57.096Z","1.5.3":"2026-04-18T05:44:57.596Z","modified":"2026-04-18T05:44:57.871Z"},"maintainers":[{"name":"psspss1122","email":"psspss1122@gmail.com"},{"name":"s2hoon326","email":"s2hoon326@gmail.com"}],"description":"ABAP connection layer for MCP ABAP ADT server (fork of @mcp-abap-adt/connection by fr0ster)","homepage":"https://github.com/babamba2/mcp-abap-connection#readme","keywords":["abap","sap","adt","connection","mcp","abap-adt"],"repository":{"type":"git","url":"git+https://github.com/babamba2/mcp-abap-connection.git"},"contributors":[{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com","url":"original author"}],"author":{"name":"babamba2","email":"psspss1122@gmail.com"},"bugs":{"url":"https://github.com/babamba2/mcp-abap-connection/issues"},"license":"MIT","readme":"# @mcp-abap-adt/connection\r\n\r\nABAP connection layer for MCP ABAP ADT server. Provides a unified interface for connecting to SAP ABAP systems via ADT (ABAP Development Tools) protocol, supporting both on-premise (Basic Auth) and cloud (JWT/OAuth2) authentication methods.\r\n\r\n## Key Features\r\n\r\n- 🔐 **Multiple Authentication Methods**: \r\n  - Basic Auth for on-premise SAP systems\r\n  - JWT/OAuth2 for SAP BTP ABAP Environment\r\n  - SAML session cookies for pre-authenticated enterprise flows\r\n- 🔄 **Token Management**: \r\n  - Token refresh is handled by `@mcp-abap-adt/auth-broker` package\r\n  - Connection package focuses on HTTP communication only\r\n- 💾 **Session Management**: \r\n  - Session headers management (cookies, CSRF tokens)\r\n  - Session state persistence is handled by `@mcp-abap-adt/auth-broker` package\r\n- 🏗️ **Clean Architecture**:\r\n  - Abstract base class for common HTTP/session logic\r\n  - Auth-type specific implementations (BaseAbapConnection, JwtAbapConnection, SamlAbapConnection)\r\n  - Proper separation of concerns - no JWT logic in base class\r\n- 🔌 **Realtime Transport Scaffold**:\r\n  - Generic `GenericWebSocketTransport` with pluggable WS factory\r\n  - Reusable for debugger/traces and other event-driven flows\r\n- 📝 **Custom Logging**: Pluggable logger interface for integration with any logging system\r\n- 🛠️ **CLI Tool**: See [JWT Auth Tools](./docs/JWT_AUTH_TOOLS.md) for obtaining SAP BTP tokens\r\n- 📦 **TypeScript**: Full TypeScript support with type definitions included\r\n- ⚡ **Timeout Management**: Configurable timeouts for different operation types\r\n\r\n## Architecture\r\n\r\nThe package uses a clean separation of concerns:\r\n\r\n- **`AbstractAbapConnection`** (abstract, internal only):\r\n  - Common HTTP request logic\r\n  - Session management (cookies, CSRF tokens)\r\n  - CSRF token fetching with retry\r\n  - Auth-agnostic - knows nothing about Basic or JWT\r\n  \r\n- **`BaseAbapConnection`** (concrete, exported):\r\n  - Basic Authentication implementation\r\n  - Simple connect() - fetches CSRF token\r\n  - Suitable for on-premise SAP systems\r\n  \r\n- **`JwtAbapConnection`** (concrete, exported):\r\n  - JWT/OAuth2 Authentication implementation\r\n  - Simple connect() - establishes connection with JWT token\r\n  - Suitable for SAP BTP ABAP Environment\r\n  - Token refresh handled by auth-broker package\r\n\r\n- **`SamlAbapConnection`** (concrete, exported):\r\n  - Session-cookie-based authentication (`authType: \"saml\"`)\r\n  - Uses existing SSO/SAML session cookies\r\n  - Fetches CSRF token and executes ADT requests in same HTTP model\r\n\r\n- **`GenericWebSocketTransport`** (concrete, exported):\r\n  - Transport abstraction for realtime WS message flows\r\n  - Pluggable factory, envelope-based send/receive\r\n  - Intended for higher-level debugger/trace session orchestration\r\n\r\n## Responsibilities and Design Principles\r\n\r\n### Core Development Principle\r\n\r\n**Interface-Only Communication**: This package follows a fundamental development principle: **all interactions with external dependencies happen ONLY through interfaces**. The code knows **NOTHING beyond what is defined in the interfaces**.\r\n\r\nThis means:\r\n- Does not know about concrete implementation classes from other packages\r\n- Does not know about internal data structures or methods not defined in interfaces\r\n- Does not make assumptions about implementation behavior beyond interface contracts\r\n- Does not access properties or methods not explicitly defined in interfaces\r\n\r\nThis principle ensures:\r\n- **Loose coupling**: Connection classes are decoupled from concrete implementations in other packages\r\n- **Flexibility**: New implementations can be added without modifying connection classes\r\n- **Testability**: Easy to mock dependencies for testing\r\n- **Maintainability**: Changes to implementations don't affect connection classes\r\n\r\n### Package Responsibilities\r\n\r\nThis package is responsible for:\r\n\r\n1. **HTTP communication with SAP systems**: Makes HTTP requests to SAP ABAP systems via ADT protocol\r\n2. **Authentication handling**: Supports Basic Auth and JWT/OAuth2 authentication methods\r\n3. **Session management**: Manages cookies, CSRF tokens, and session state\r\n4. **Error handling**: Handles HTTP errors and connection issues\r\n\r\n#### What This Package Does\r\n\r\n- **Provides connection abstraction**: `AbapConnection` interface for interacting with SAP systems\r\n- **Handles HTTP requests**: Makes requests to SAP ADT endpoints with proper headers and authentication\r\n- **Manages sessions**: Handles cookies, CSRF tokens, and session state persistence\r\n\r\n#### What This Package Does NOT Do\r\n\r\n- **Does NOT obtain tokens**: Token acquisition is handled by `@mcp-abap-adt/auth-providers` and `@mcp-abap-adt/auth-broker`\r\n- **Does NOT store tokens**: Token storage is handled by `@mcp-abap-adt/auth-stores`\r\n- **Does NOT refresh tokens**: Token refresh is handled by `@mcp-abap-adt/auth-broker`\r\n- **Does NOT orchestrate authentication**: Token lifecycle management is handled by `@mcp-abap-adt/auth-broker`\r\n- **Does NOT know about destinations**: Destination-based authentication is handled by consumers\r\n- **Does NOT handle OAuth2 flows**: OAuth2 flows are handled by token providers\r\n\r\n### External Dependencies\r\n\r\nThis package interacts with external packages **ONLY through interfaces**:\r\n\r\n- **Logger interface**: Uses `ILogger` interface for logging - does not know about concrete logger implementation\r\n- **No direct dependencies on auth packages**: All token-related operations are handled through configuration (`SapConfig`) passed by consumers\r\n\r\n## Documentation\r\n\r\n- 📦 **[Installation Guide](./docs/INSTALLATION.md)** - Setup and installation instructions\r\n- 📚 **[Usage Guide](./docs/USAGE.md)** - Detailed usage examples and API documentation\r\n- 💡 **[Examples](./examples/)** - Working code examples\r\n\r\n## Features\r\n\r\n- 🔐 **Multiple Authentication Methods**: Basic Auth for on-premise systems, JWT/OAuth2 for SAP BTP ABAP Environment\r\n- 💾 **Session Management**: Session headers management (cookies, CSRF tokens) for HTTP communication\r\n- 📝 **Custom Logging**: Pluggable logger interface for integration with any logging system (optional)\r\n- 📦 **TypeScript**: Full TypeScript support with type definitions included\r\n- ⚡ **Timeout Management**: Configurable timeouts for different operation types\r\n- 🌐 **Network Error Detection**: Automatic detection and proper handling of network-level errors (connection refused, timeout, DNS failures)\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @mcp-abap-adt/connection\r\n```\r\n\r\nFor detailed installation instructions, see [Installation Guide](./docs/INSTALLATION.md).\r\n\r\n## Quick Start\r\n\r\n### Basic Usage (On-Premise)\r\n\r\n```typescript\r\nimport { createAbapConnection, SapConfig } from \"@mcp-abap-adt/connection\";\r\n\r\nconst config: SapConfig = {\r\n  url: \"https://your-sap-system.com\",\r\n  client: \"100\",\r\n  authType: \"basic\",\r\n  username: \"your-username\",\r\n  password: \"your-password\",\r\n};\r\n\r\n// Create a simple logger\r\nconst logger = {\r\n  info: (msg: string, meta?: any) => console.log(msg, meta),\r\n  error: (msg: string, meta?: any) => console.error(msg, meta),\r\n  warn: (msg: string, meta?: any) => console.warn(msg, meta),\r\n  debug: (msg: string, meta?: any) => console.debug(msg, meta),\r\n};\r\n\r\n// Create connection\r\nconst connection = createAbapConnection(config, logger);\r\n\r\n// Make ADT request\r\nconst response = await connection.makeAdtRequest({\r\n  method: \"GET\",\r\n  url: \"/sap/bc/adt/programs/programs/your-program\",\r\n});\r\n```\r\n\r\n### Cloud Usage (JWT/OAuth2)\r\n\r\n```typescript\r\nimport { createAbapConnection, SapConfig } from \"@mcp-abap-adt/connection\";\r\n\r\n// JWT configuration\r\nconst config: SapConfig = {\r\n  url: \"https://your-instance.abap.cloud.sap\",\r\n  client: \"100\", // Optional\r\n  authType: \"jwt\",\r\n  jwtToken: \"your-jwt-token-here\", // Obtained via OAuth2 flow\r\n};\r\n\r\nconst logger = {\r\n  info: (msg: string, meta?: any) => console.log(msg, meta),\r\n  error: (msg: string, meta?: any) => console.error(msg, meta),\r\n  warn: (msg: string, meta?: any) => console.warn(msg, meta),\r\n  debug: (msg: string, meta?: any) => console.debug(msg, meta),\r\n};\r\n\r\n// Logger is optional - if not provided, no logging output\r\nconst connection = createAbapConnection(config, logger);\r\n\r\n// Note: Token refresh is handled by @mcp-abap-adt/auth-broker package\r\nconst response = await connection.makeAdtRequest({\r\n  method: \"GET\",\r\n  url: \"/sap/bc/adt/programs/programs/your-program\",\r\n});\r\n```\r\n\r\n### SSO Usage (SAML Session Cookies)\r\n\r\n```typescript\r\nimport { createAbapConnection, SapConfig } from \"@mcp-abap-adt/connection\";\r\n\r\nconst config: SapConfig = {\r\n  url: \"https://your-sap-system.com\",\r\n  authType: \"saml\",\r\n  sessionCookies: \"MYSAPSSO2=...; SAP_SESSIONID=...\",\r\n};\r\n\r\nconst connection = createAbapConnection(config, logger);\r\nconst response = await connection.makeAdtRequest({\r\n  method: \"GET\",\r\n  url: \"/sap/bc/adt/programs/programs/your-program\",\r\n});\r\n```\r\n\r\n### Cloud Usage with Automatic Token Refresh\r\n\r\nFor automatic token refresh on 401/403 errors, inject `ITokenRefresher`:\r\n\r\n```typescript\r\nimport { JwtAbapConnection, SapConfig } from \"@mcp-abap-adt/connection\";\r\nimport type { ITokenRefresher } from \"@mcp-abap-adt/interfaces\";\r\n\r\n// Token refresher provides token acquisition and refresh\r\n// (created by @mcp-abap-adt/auth-broker or custom implementation)\r\nconst tokenRefresher: ITokenRefresher = {\r\n  getToken: async () => { /* return current token */ },\r\n  refreshToken: async () => { /* refresh and return new token */ },\r\n};\r\n\r\n// JWT configuration\r\nconst config: SapConfig = {\r\n  url: \"https://your-instance.abap.cloud.sap\",\r\n  authType: \"jwt\",\r\n  jwtToken: await tokenRefresher.getToken(), // Get initial token\r\n};\r\n\r\n// Create connection with token refresher - 401/403 handled automatically\r\nconst connection = new JwtAbapConnection(config, logger, undefined, tokenRefresher);\r\n\r\n// Requests automatically retry with refreshed token on auth errors\r\nconst response = await connection.makeAdtRequest({\r\n  method: \"GET\",\r\n  url: \"/sap/bc/adt/programs/programs/your-program\",\r\n});\r\n```\r\n\r\n### Stateful Sessions\r\n\r\nFor operations that require session state (e.g., object modifications), you can enable stateful sessions:\r\n\r\n```typescript\r\nimport { createAbapConnection } from \"@mcp-abap-adt/connection\";\r\n\r\nconst connection = createAbapConnection(config, logger);\r\n\r\n// Enable stateful session mode (adds x-sap-adt-sessiontype: stateful header)\r\nconnection.setSessionType(\"stateful\");\r\n\r\n// Make requests - SAP will maintain session state\r\nawait connection.makeAdtRequest({\r\n  method: \"POST\",\r\n  url: \"/sap/bc/adt/objects/domains\",\r\n  data: { /* domain data */ },\r\n});\r\n\r\n// Note: Session state persistence is handled by @mcp-abap-adt/auth-broker package\r\n```\r\n\r\n### Custom Logger\r\n\r\n```typescript\r\nimport { ILogger } from \"@mcp-abap-adt/connection\";\r\n\r\nclass MyLogger implements ILogger {\r\n  info(message: string, meta?: any): void {\r\n    // Your logging implementation\r\n  }\r\n\r\n  error(message: string, meta?: any): void {\r\n    // Your logging implementation\r\n  }\r\n\r\n  warn(message: string, meta?: any): void {\r\n    // Your logging implementation\r\n  }\r\n\r\n  debug(message: string, meta?: any): void {\r\n    // Your logging implementation\r\n  }\r\n\r\n  csrfToken(action: \"fetch\" | \"retry\" | \"success\" | \"error\", message: string, meta?: any): void {\r\n    // CSRF token specific logging\r\n  }\r\n\r\n  tlsConfig(rejectUnauthorized: boolean): void {\r\n    // TLS configuration logging\r\n  }\r\n}\r\n\r\nconst logger = new MyLogger();\r\nconst connection = createAbapConnection(config, logger);\r\n```\r\n\r\n## CLI Tool\r\n\r\nThe package includes a CLI tool for authenticating with SAP BTP using service keys:\r\n\r\n### Installation Options\r\n\r\n- **Local project install**\r\n  ```bash\r\n  npm install @mcp-abap-adt/connection --save-dev\r\n  npx sap-abap-auth auth -k path/to/service-key.json\r\n  ```\r\n- **Global install**\r\n  ```bash\r\n  npm install -g @mcp-abap-adt/connection\r\n  sap-abap-auth auth -k path/to/service-key.json\r\n  ```\r\n- **On-demand (npx)**\r\n  ```bash\r\n  npx @mcp-abap-adt/connection sap-abap-auth auth -k path/to/service-key.json\r\n  ```\r\n\r\n### Usage\r\n\r\n```bash\r\n# Show help\r\nsap-abap-auth --help\r\n\r\n# Authenticate with service key\r\nsap-abap-auth auth -k service-key.json\r\n\r\n# Specify browser\r\nsap-abap-auth auth -k service-key.json --browser chrome\r\n\r\n# Custom output file\r\nsap-abap-auth auth -k service-key.json --output .env.production\r\n```\r\n\r\n### Options\r\n\r\n- `-k, --key <path>` - Path to service key JSON file (required)\r\n- `-b, --browser <name>` - Browser to open (chrome, edge, firefox, system, none)\r\n- `-o, --output <path>` - Path to output .env file (default: .env)\r\n- `-h, --help` - Show help message\r\n\r\n### Using via `npx` (without global install)\r\n\r\nIf `@mcp-abap-adt/connection` is listed as a dependency in your project, you can invoke the CLI directly:\r\n\r\n```bash\r\nnpx sap-abap-auth auth -k service-key.json\r\n```\r\n\r\nThis works even when you do not install the package globally. For one-off usage, you can also run:\r\n\r\n```bash\r\nnpx @mcp-abap-adt/connection sap-abap-auth auth -k service-key.json\r\n```\r\n\r\nThis will download the package on demand and execute the CLI.\r\n## API Reference\r\n\r\n### Types\r\n\r\n#### `SapConfig`\r\n\r\nConfiguration for SAP ABAP connection.\r\n\r\n```typescript\r\ntype SapConfig = {\r\n  url: string;\r\n  client?: string;\r\n  authType: \"basic\" | \"jwt\" | \"saml\";\r\n  // For basic auth\r\n  username?: string;\r\n  password?: string;\r\n  // For JWT auth\r\n  jwtToken?: string;\r\n  // For SAML session cookies\r\n  sessionCookies?: string;\r\n};\r\n```\r\n\r\n#### `AbapConnection`\r\n\r\nMain interface for ABAP connections.\r\n\r\n```typescript\r\ninterface AbapConnection {\r\n  makeAdtRequest(options: AbapRequestOptions): Promise<AxiosResponse>;\r\n  reset(): void;\r\n  setSessionType(type: \"stateless\" | \"stateful\"): void; // Switch session type\r\n  getSessionMode(): \"stateless\" | \"stateful\"; // Get current session mode\r\n  getSessionId(): string | null; // Get current session ID\r\n}\r\n```\r\n\r\n**Session Management:**\r\n- `setSessionType(type)`: Programmatically switch between stateful and stateless modes\r\n- `getSessionMode()`: Returns current session mode\r\n- `getSessionId()`: Returns the current session ID (auto-generated UUID)\r\n\r\n#### `ILogger`\r\n\r\nLogger interface for custom logging implementations.\r\n\r\n```typescript\r\ninterface ILogger {\r\n  info(message: string, meta?: any): void;\r\n  error(message: string, meta?: any): void;\r\n  warn(message: string, meta?: any): void;\r\n  debug(message: string, meta?: any): void;\r\n  csrfToken?(action: \"fetch\" | \"retry\" | \"success\" | \"error\", message: string, meta?: any): void;\r\n  tlsConfig?(rejectUnauthorized: boolean): void;\r\n}\r\n```\r\n\r\n### Functions\r\n\r\n#### `createAbapConnection(config, logger?, sessionId?)`\r\n\r\nFactory function to create an ABAP connection instance.\r\n\r\n```typescript\r\nfunction createAbapConnection(\r\n  config: SapConfig,\r\n  logger?: ILogger | null,\r\n  sessionId?: string\r\n): AbapConnection;\r\n```\r\n\r\n#### `CSRF_CONFIG` and `CSRF_ERROR_MESSAGES`\r\n\r\n**New in 0.1.13+:** Exported constants for consistent CSRF token handling across different connection implementations.\r\n\r\n```typescript\r\nimport { CSRF_CONFIG, CSRF_ERROR_MESSAGES } from '@mcp-abap-adt/connection';\r\n\r\n// CSRF_CONFIG contains:\r\n// - RETRY_COUNT: number (default: 3)\r\n// - RETRY_DELAY: number (default: 1000ms)\r\n// - ENDPOINT: string (default: '/sap/bc/adt/core/discovery')\r\n// - REQUIRED_HEADERS: { 'x-csrf-token': 'fetch', 'Accept': 'application/atomsvc+xml' }\r\n\r\n// CSRF_ERROR_MESSAGES contains:\r\n// - FETCH_FAILED(attempts: number, cause: string): string\r\n// - NOT_IN_HEADERS: string\r\n// - REQUIRED_FOR_MUTATION: string\r\n```\r\n\r\n**Use case:** When implementing custom connection classes (e.g., Cloud SDK-based), you can use these constants to ensure consistent CSRF token handling:\r\n\r\n```typescript\r\nimport { CSRF_CONFIG, CSRF_ERROR_MESSAGES } from '@mcp-abap-adt/connection';\r\n\r\nasync function fetchCsrfToken(baseUrl: string): Promise<string> {\r\n  const csrfUrl = `${baseUrl}${CSRF_CONFIG.ENDPOINT}`;\r\n  \r\n  for (let attempt = 0; attempt <= CSRF_CONFIG.RETRY_COUNT; attempt++) {\r\n    try {\r\n      const response = await yourHttpClient.get(csrfUrl, {\r\n        headers: CSRF_CONFIG.REQUIRED_HEADERS\r\n      });\r\n      \r\n      const token = response.headers['x-csrf-token'];\r\n      if (!token) {\r\n        if (attempt < CSRF_CONFIG.RETRY_COUNT) {\r\n          await new Promise(resolve => setTimeout(resolve, CSRF_CONFIG.RETRY_DELAY));\r\n          continue;\r\n        }\r\n        throw new Error(CSRF_ERROR_MESSAGES.NOT_IN_HEADERS);\r\n      }\r\n      \r\n      return token;\r\n    } catch (error) {\r\n      if (attempt >= CSRF_CONFIG.RETRY_COUNT) {\r\n        throw new Error(\r\n          CSRF_ERROR_MESSAGES.FETCH_FAILED(\r\n            CSRF_CONFIG.RETRY_COUNT + 1,\r\n            error instanceof Error ? error.message : String(error)\r\n          )\r\n        );\r\n      }\r\n      await new Promise(resolve => setTimeout(resolve, CSRF_CONFIG.RETRY_DELAY));\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nSee [PR Proposal](./PR_PROPOSAL_CSRF_CONFIG.md) for more details.\r\n\r\n## Requirements\r\n\r\n- Node.js >= 18.0.0\r\n- Access to SAP ABAP system (on-premise or BTP)\r\n\r\n## Changelog\r\n\r\nSee [CHANGELOG.md](./CHANGELOG.md) for detailed version history and breaking changes.\r\n\r\n**Latest version: 0.2.0**\r\n- Removed token refresh functionality (handled by `@mcp-abap-adt/auth-broker`)\r\n- Removed session storage functionality (handled by `@mcp-abap-adt/auth-broker`)\r\n- Logger is now optional\r\n- See [CHANGELOG.md](./CHANGELOG.md) for full details\r\n\r\n## Documentation\r\n\r\n- [Examples](./examples/README.md) - Working code examples\r\n- [Changelog](./CHANGELOG.md) - Version history and release notes\r\n\r\n## License\r\n\r\nMIT\r\n\r\n## Repository\r\n\r\nhttps://github.com/fr0ster/mcp-abap-adt\r\n\r\n## Related Projects\r\n\r\n- [mcp-abap-adt](https://github.com/fr0ster/mcp-abap-adt) - Main MCP server for ABAP ADT\r\n","readmeFilename":"README.md","_rev":"1-f80831a6eb59a1c05f1569764a98af63"}