naftiko: 1.0.0-alpha2 info: label: SAP Crystal Reports RESTful Web Services API — OData description: 'SAP Crystal Reports RESTful Web Services API — OData. 10 operations. Lead operation: Crystal Reports Get OData Service Document. Self-contained Naftiko capability covering one Crystal Reports business surface.' tags: - Crystal Reports - OData created: '2026-05-19' modified: '2026-05-19' binds: - namespace: env keys: CRYSTAL_REPORTS_API_KEY: CRYSTAL_REPORTS_API_KEY capability: consumes: - type: http namespace: rest-odata baseUri: http://{host}:{port}/biprws description: SAP Crystal Reports RESTful Web Services API — OData business capability. Self-contained, no shared references. resources: - name: infostore-reportId-rpt-data.svc path: /infostore/{reportId}/rpt/data.svc operations: - name: getodataservicedocument method: GET description: Crystal Reports Get OData Service Document outputRawFormat: json outputParameters: - name: result type: object value: $. - name: infostore-reportId-rpt-data.svc-$metadata path: /infostore/{reportId}/rpt/data.svc/$metadata operations: - name: getodatametadata method: GET description: Crystal Reports Get EDMX Metadata Document outputRawFormat: json outputParameters: - name: result type: object value: $. - name: infostore-reportId-rpt-data.svc-GrandTotals path: /infostore/{reportId}/rpt/data.svc/GrandTotals operations: - name: getgrandtotals method: GET description: Crystal Reports Get Grand Totals outputRawFormat: json outputParameters: - name: result type: object value: $. - name: infostore-reportId-rpt-data.svc-Rows path: /infostore/{reportId}/rpt/data.svc/Rows operations: - name: getreportdatarows method: GET description: Crystal Reports Get Report Data Rows outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: $skip in: query type: integer description: Number of rows to skip - name: $skiptoken in: query type: string description: Token for server-driven paging - name: $inlinecount in: query type: string description: Include total count in response - name: $count in: query type: boolean description: Return only the count of rows - name: $select in: query type: string description: Comma-separated list of fields to include - name: pushdatarow method: POST description: Crystal Reports Push a Row of Data to Transient Instance outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: body in: body type: object description: Request body (JSON). required: true - name: infostore-reportId-rpt-data.svc-Rows({index}) path: /infostore/{reportId}/rpt/data.svc/Rows({index}) operations: - name: getreportdatarowbyindex method: GET description: Crystal Reports Get Specific Row by Index outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: index in: path type: integer description: Zero-based index of the row required: true - name: infostore-reportId-rpt-data.svc-Rows({index})-fieldName path: /infostore/{reportId}/rpt/data.svc/Rows({index})/{fieldName} operations: - name: getrowfieldvalue method: GET description: Crystal Reports Get Specific Field from Row outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: index in: path type: integer description: Zero-based index of the row required: true - name: fieldName in: path type: string description: Name of the field to retrieve required: true - name: infostore-reportId-rpt-data.svc-Rows({index})-fieldName-$value path: /infostore/{reportId}/rpt/data.svc/Rows({index})/{fieldName}/$value operations: - name: getrowfieldrawvalue method: GET description: Crystal Reports Get Raw Field Value outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: index in: path type: integer description: Zero-based index of the row required: true - name: fieldName in: path type: string description: Name of the field to retrieve required: true - name: infostore-reportId-rpt-data.svc-GroupName path: /infostore/{reportId}/rpt/data.svc/{GroupName} operations: - name: getgroupdata method: GET description: Crystal Reports Get Group Data outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: GroupName in: path type: string description: Name of the group collection required: true - name: infostore-reportId-rpt-data.svc-GroupName}('{groupPath}') path: /infostore/{reportId}/rpt/data.svc/{GroupName}('{groupPath}') operations: - name: getgroupbypath method: GET description: Crystal Reports Get Specific Group by Path outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: GroupName in: path type: string description: Name of the group collection required: true - name: groupPath in: path type: string description: Path identifier for the specific group entry required: true authentication: type: apikey key: X-SAP-LogonToken value: '{{env.CRYSTAL_REPORTS_API_KEY}}' placement: header exposes: - type: rest namespace: rest-odata-rest port: 8080 description: REST adapter for SAP Crystal Reports RESTful Web Services API — OData. One Spectral-compliant resource per consumed operation, prefixed with /v1. resources: - path: /v1/infostore/{reportid}/rpt/data-svc name: infostore-reportid-rpt-data-svc description: REST surface for infostore-reportId-rpt-data.svc. operations: - method: GET name: getodataservicedocument description: Crystal Reports Get OData Service Document call: rest-odata.getodataservicedocument outputParameters: - type: object mapping: $. - path: /v1/infostore/{reportid}/rpt/data-svc/metadata name: infostore-reportid-rpt-data-svc-metadata description: REST surface for infostore-reportId-rpt-data.svc-$metadata. operations: - method: GET name: getodatametadata description: Crystal Reports Get EDMX Metadata Document call: rest-odata.getodatametadata outputParameters: - type: object mapping: $. - path: /v1/infostore/{reportid}/rpt/data-svc/grandtotals name: infostore-reportid-rpt-data-svc-grandtotals description: REST surface for infostore-reportId-rpt-data.svc-GrandTotals. operations: - method: GET name: getgrandtotals description: Crystal Reports Get Grand Totals call: rest-odata.getgrandtotals outputParameters: - type: object mapping: $. - path: /v1/infostore/{reportid}/rpt/data-svc/rows name: infostore-reportid-rpt-data-svc-rows description: REST surface for infostore-reportId-rpt-data.svc-Rows. operations: - method: GET name: getreportdatarows description: Crystal Reports Get Report Data Rows call: rest-odata.getreportdatarows with: $skip: rest.$skip $skiptoken: rest.$skiptoken $inlinecount: rest.$inlinecount $count: rest.$count $select: rest.$select outputParameters: - type: object mapping: $. - method: POST name: pushdatarow description: Crystal Reports Push a Row of Data to Transient Instance call: rest-odata.pushdatarow with: body: rest.body outputParameters: - type: object mapping: $. - path: /v1/infostore/{reportid}/rpt/data-svc/rows-index name: infostore-reportid-rpt-data-svc-rows-index description: REST surface for infostore-reportId-rpt-data.svc-Rows({index}). operations: - method: GET name: getreportdatarowbyindex description: Crystal Reports Get Specific Row by Index call: rest-odata.getreportdatarowbyindex with: index: rest.index outputParameters: - type: object mapping: $. - path: /v1/infostore/{reportid}/rpt/data-svc/rows-index/{fieldname} name: infostore-reportid-rpt-data-svc-rows-index-fieldname description: REST surface for infostore-reportId-rpt-data.svc-Rows({index})-fieldName. operations: - method: GET name: getrowfieldvalue description: Crystal Reports Get Specific Field from Row call: rest-odata.getrowfieldvalue with: index: rest.index fieldName: rest.fieldName outputParameters: - type: object mapping: $. - path: /v1/infostore/{reportid}/rpt/data-svc/rows-index/{fieldname}/value name: infostore-reportid-rpt-data-svc-rows-index-fieldname-value description: REST surface for infostore-reportId-rpt-data.svc-Rows({index})-fieldName-$value. operations: - method: GET name: getrowfieldrawvalue description: Crystal Reports Get Raw Field Value call: rest-odata.getrowfieldrawvalue with: index: rest.index fieldName: rest.fieldName outputParameters: - type: object mapping: $. - path: /v1/infostore/{reportid}/rpt/data-svc/{groupname} name: infostore-reportid-rpt-data-svc-groupname description: REST surface for infostore-reportId-rpt-data.svc-GroupName. operations: - method: GET name: getgroupdata description: Crystal Reports Get Group Data call: rest-odata.getgroupdata with: GroupName: rest.GroupName outputParameters: - type: object mapping: $. - path: /v1/infostore/{reportid}/rpt/data-svc/groupname-grouppath name: infostore-reportid-rpt-data-svc-groupname-grouppath description: REST surface for infostore-reportId-rpt-data.svc-GroupName}('{groupPath}'). operations: - method: GET name: getgroupbypath description: Crystal Reports Get Specific Group by Path call: rest-odata.getgroupbypath with: GroupName: rest.GroupName groupPath: rest.groupPath outputParameters: - type: object mapping: $. - type: mcp namespace: rest-odata-mcp port: 9090 transport: http description: MCP adapter for SAP Crystal Reports RESTful Web Services API — OData. One tool per consumed operation, routed inline through this capability's consumes block. tools: - name: crystal-reports-get-odata-service description: Crystal Reports Get OData Service Document hints: readOnly: true destructive: false idempotent: true call: rest-odata.getodataservicedocument outputParameters: - type: object mapping: $. - name: crystal-reports-get-edmx-metadata description: Crystal Reports Get EDMX Metadata Document hints: readOnly: true destructive: false idempotent: true call: rest-odata.getodatametadata outputParameters: - type: object mapping: $. - name: crystal-reports-get-grand-totals description: Crystal Reports Get Grand Totals hints: readOnly: true destructive: false idempotent: true call: rest-odata.getgrandtotals outputParameters: - type: object mapping: $. - name: crystal-reports-get-report-data description: Crystal Reports Get Report Data Rows hints: readOnly: true destructive: false idempotent: true call: rest-odata.getreportdatarows with: $skip: tools.$skip $skiptoken: tools.$skiptoken $inlinecount: tools.$inlinecount $count: tools.$count $select: tools.$select outputParameters: - type: object mapping: $. - name: crystal-reports-push-row-data description: Crystal Reports Push a Row of Data to Transient Instance hints: readOnly: false destructive: false idempotent: false call: rest-odata.pushdatarow with: body: tools.body outputParameters: - type: object mapping: $. - name: crystal-reports-get-specific-row description: Crystal Reports Get Specific Row by Index hints: readOnly: true destructive: false idempotent: true call: rest-odata.getreportdatarowbyindex with: index: tools.index outputParameters: - type: object mapping: $. - name: crystal-reports-get-specific-field description: Crystal Reports Get Specific Field from Row hints: readOnly: true destructive: false idempotent: true call: rest-odata.getrowfieldvalue with: index: tools.index fieldName: tools.fieldName outputParameters: - type: object mapping: $. - name: crystal-reports-get-raw-field description: Crystal Reports Get Raw Field Value hints: readOnly: true destructive: false idempotent: true call: rest-odata.getrowfieldrawvalue with: index: tools.index fieldName: tools.fieldName outputParameters: - type: object mapping: $. - name: crystal-reports-get-group-data description: Crystal Reports Get Group Data hints: readOnly: true destructive: false idempotent: true call: rest-odata.getgroupdata with: GroupName: tools.GroupName outputParameters: - type: object mapping: $. - name: crystal-reports-get-specific-group description: Crystal Reports Get Specific Group by Path hints: readOnly: true destructive: false idempotent: true call: rest-odata.getgroupbypath with: GroupName: tools.GroupName groupPath: tools.groupPath outputParameters: - type: object mapping: $.