sap-b1-mcp-server
Version:
SAP Business One Service Layer MCP Server
1,146 lines • 47.3 kB
JavaScript
import { z } from 'zod';
// Schema for business partner operations
const getBusinessPartnersSchema = z.object({
filter: z.string().optional().describe('OData $filter expression (e.g., "CardType eq \'cCustomer\'" or "contains(CardName,\'Microsoft\')")'),
select: z.string().optional().describe('OData $select expression to specify fields (e.g., "CardCode,CardName,CardType")'),
orderby: z.string().optional().describe('OData $orderby expression (e.g., "CardName asc" or "CreationDate desc")'),
top: z.number().optional().describe('Maximum number of records to return'),
skip: z.number().optional().describe('Number of records to skip for pagination'),
cardType: z.enum(['cCustomer', 'cSupplier', 'cLid']).optional().describe('Filter by business partner type')
});
const createBusinessPartnerSchema = z.object({
CardName: z.string().describe('Business partner name (required)'),
CardType: z.enum(['cCustomer', 'cSupplier', 'cLid']).describe('Business partner type'),
GroupCode: z.number().optional().describe('Business partner group code'),
Address: z.string().optional().describe('Primary address'),
ZipCode: z.string().optional().describe('ZIP code'),
MailAddress: z.string().optional().describe('Mailing address'),
MailZipCode: z.string().optional().describe('Mailing ZIP code'),
Phone1: z.string().optional().describe('Primary phone number'),
Phone2: z.string().optional().describe('Secondary phone number'),
Fax: z.string().optional().describe('Fax number'),
ContactPerson: z.string().optional().describe('Contact person name'),
Notes: z.string().optional().describe('Notes'),
EmailAddress: z.string().email().optional().describe('Email address'),
Website: z.string().url().optional().describe('Website URL'),
Currency: z.string().optional().describe('Default currency code'),
Valid: z.enum(['tYES', 'tNO']).optional().describe('Whether the business partner is valid'),
Frozen: z.enum(['tYES', 'tNO']).optional().describe('Whether the business partner is frozen')
});
const updateBusinessPartnerSchema = z.object({
CardCode: z.string().describe('Business partner code to update'),
updates: z.object({
CardName: z.string().optional(),
GroupCode: z.number().optional(),
Address: z.string().optional(),
ZipCode: z.string().optional(),
MailAddress: z.string().optional(),
MailZipCode: z.string().optional(),
Phone1: z.string().optional(),
Phone2: z.string().optional(),
Fax: z.string().optional(),
ContactPerson: z.string().optional(),
Notes: z.string().optional(),
EmailAddress: z.string().email().optional(),
Website: z.string().url().optional(),
Currency: z.string().optional(),
Valid: z.enum(['tYES', 'tNO']).optional(),
Frozen: z.enum(['tYES', 'tNO']).optional()
}).describe('Fields to update')
});
// Schema for item operations
const getItemsSchema = z.object({
filter: z.string().optional().describe('OData $filter expression (e.g., "ItemType eq \'it_Item\'" or "contains(ItemName,\'Laptop\')")'),
select: z.string().optional().describe('OData $select expression to specify fields (e.g., "ItemCode,ItemName,QuantityOnStock")'),
orderby: z.string().optional().describe('OData $orderby expression (e.g., "ItemName asc" or "QuantityOnStock desc")'),
top: z.number().optional().describe('Maximum number of records to return'),
skip: z.number().optional().describe('Number of records to skip for pagination')
});
const createItemSchema = z.object({
ItemName: z.string().describe('Item name (required)'),
ForeignName: z.string().optional().describe('Foreign language name'),
ItemsGroupCode: z.number().optional().describe('Item group code'),
BarCode: z.string().optional().describe('Barcode'),
VatLiable: z.enum(['tYES', 'tNO']).optional().describe('VAT liable'),
PurchaseItem: z.enum(['tYES', 'tNO']).optional().describe('Can be purchased'),
SalesItem: z.enum(['tYES', 'tNO']).optional().describe('Can be sold'),
InventoryItem: z.enum(['tYES', 'tNO']).optional().describe('Inventory item'),
IncomeAccount: z.string().optional().describe('Income account code'),
ExemptIncomeAccount: z.string().optional().describe('Exempt income account code'),
ExpanseAccount: z.string().optional().describe('Expense account code'),
Mainsupplier: z.string().optional().describe('Main supplier code'),
SupplierCatalogNo: z.string().optional().describe('Supplier catalog number'),
DesiredInventory: z.number().optional().describe('Desired inventory level'),
MinInventory: z.number().optional().describe('Minimum inventory level'),
CommissionPercent: z.number().optional().describe('Commission percentage'),
Valid: z.enum(['tYES', 'tNO']).optional().describe('Whether the item is valid'),
Frozen: z.enum(['tYES', 'tNO']).optional().describe('Whether the item is frozen')
});
// Schema for single business partner getter
const getBusinessPartnerSchema = z.object({
cardCode: z.string().describe('Business partner code (CardCode)'),
select: z.string().optional().describe('OData $select expression to specify fields (e.g., "CardCode,CardName,CardType")'),
expand: z.string().optional().describe('OData $expand expression to include related data')
});
// Schema for single item getter
const getItemSchema = z.object({
itemCode: z.string().describe('Item code (ItemCode)'),
select: z.string().optional().describe('OData $select expression to specify fields (e.g., "ItemCode,ItemName,QuantityOnStock")'),
expand: z.string().optional().describe('OData $expand expression to include related data')
});
// Schema for item groups (product categories)
const getItemGroupsSchema = z.object({
filter: z.string().optional().describe('OData $filter expression (e.g., "contains(GroupName,\'Hardware\')")'),
select: z.string().optional().describe('OData $select expression to specify fields (e.g., "Number,GroupName")'),
orderby: z.string().optional().describe('OData $orderby expression (e.g., "GroupName asc")'),
top: z.number().optional().describe('Maximum number of records to return'),
skip: z.number().optional().describe('Number of records to skip for pagination')
});
// Schema for warehouse operations
const getWarehousesSchema = z.object({
filter: z.string().optional().describe('OData $filter expression (e.g., "Inactive eq \'tNO\'" or "contains(WarehouseName,\'Main\')")'),
select: z.string().optional().describe('OData $select expression to specify fields (e.g., "WarehouseCode,WarehouseName,Inactive")'),
orderby: z.string().optional().describe('OData $orderby expression (e.g., "WarehouseName asc" or "WarehouseCode desc")'),
top: z.number().optional().describe('Maximum number of records to return'),
skip: z.number().optional().describe('Number of records to skip for pagination')
});
const getWarehouseSchema = z.object({
warehouseCode: z.string().describe('Warehouse code (required)'),
select: z.string().optional().describe('OData $select expression to specify fields'),
expand: z.string().optional().describe('OData $expand expression to include related data')
});
// Schema for price list operations
const getPriceListsSchema = z.object({
filter: z.string().optional().describe('OData $filter expression (e.g., "Active eq \'tYES\'" or "contains(PriceListName,\'Standard\')")'),
select: z.string().optional().describe('OData $select expression to specify fields (e.g., "PriceListNo,PriceListName,Active")'),
orderby: z.string().optional().describe('OData $orderby expression (e.g., "PriceListName asc" or "PriceListNo desc")'),
top: z.number().optional().describe('Maximum number of records to return'),
skip: z.number().optional().describe('Number of records to skip for pagination')
});
const getPriceListSchema = z.object({
priceListNo: z.number().describe('Price list number (required)'),
select: z.string().optional().describe('OData $select expression to specify fields'),
expand: z.string().optional().describe('OData $expand expression to include related data')
});
// Schema for item stock operations
const getItemStockSchema = z.object({
itemCode: z.string().describe('Item code (required)'),
warehouseCode: z.string().describe('Warehouse code (required)'),
select: z.string().optional().describe('OData $select expression to specify fields (e.g., "InStock,Available,Committed")')
});
const getItemStockAllSchema = z.object({
itemCode: z.string().describe('Item code (required)'),
filter: z.string().optional().describe('OData $filter expression to filter warehouses'),
select: z.string().optional().describe('OData $select expression to specify fields'),
orderby: z.string().optional().describe('OData $orderby expression (e.g., "WarehouseCode asc")'),
top: z.number().optional().describe('Maximum number of records to return'),
skip: z.number().optional().describe('Number of records to skip for pagination')
});
// Schema for item price operations
const getItemPriceSchema = z.object({
itemCode: z.string().describe('Item code (required)'),
priceListId: z.number().describe('Price list ID (required)'),
select: z.string().optional().describe('OData $select expression to specify fields (e.g., "Price,Currency,Factor")')
});
const getItemPricesAllSchema = z.object({
itemCode: z.string().describe('Item code (required)'),
filter: z.string().optional().describe('OData $filter expression to filter price lists'),
select: z.string().optional().describe('OData $select expression to specify fields'),
orderby: z.string().optional().describe('OData $orderby expression (e.g., "PriceList asc")'),
top: z.number().optional().describe('Maximum number of records to return'),
skip: z.number().optional().describe('Number of records to skip for pagination')
});
export const masterDataTools = [
{
name: 'sap_get_business_partners',
description: 'Retrieve business partners (customers/vendors) from SAP Business One with optional filtering, selection, and pagination. Server limit: 20 records maximum per request. Use skip/top for pagination.',
inputSchema: {
type: 'object',
properties: {
filter: {
type: 'string',
description: 'OData $filter expression (e.g., "CardType eq \'cCustomer\'" or "contains(CardName,\'Microsoft\')")'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields (e.g., "CardCode,CardName,CardType")'
},
orderby: {
type: 'string',
description: 'OData $orderby expression (e.g., "CardName asc" or "CreationDate desc")'
},
top: {
type: 'number',
description: 'Maximum number of records to return (server limit: 20, use 20 for best performance)'
},
skip: {
type: 'number',
description: 'Number of records to skip for pagination (0-based, e.g., skip=20 for page 2, skip=40 for page 3)'
},
cardType: {
type: 'string',
enum: ['cCustomer', 'cSupplier', 'cLid'],
description: 'Filter by business partner type'
}
},
additionalProperties: false
}
},
{
name: 'sap_get_business_partner',
description: 'Retrieve a single business partner (customer/vendor) by CardCode from SAP Business One.',
inputSchema: {
type: 'object',
properties: {
cardCode: {
type: 'string',
description: 'Business partner code (CardCode)'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields (e.g., "CardCode,CardName,CardType")'
},
expand: {
type: 'string',
description: 'OData $expand expression to include related data'
}
},
required: ['cardCode'],
additionalProperties: false
}
},
{
name: 'sap_create_business_partner',
description: 'Create a new business partner (customer/vendor) in SAP Business One.',
inputSchema: {
type: 'object',
properties: {
CardName: {
type: 'string',
description: 'Business partner name (required)'
},
CardType: {
type: 'string',
enum: ['cCustomer', 'cSupplier', 'cLid'],
description: 'Business partner type'
},
GroupCode: {
type: 'number',
description: 'Business partner group code'
},
Address: {
type: 'string',
description: 'Primary address'
},
ZipCode: {
type: 'string',
description: 'ZIP code'
},
MailAddress: {
type: 'string',
description: 'Mailing address'
},
MailZipCode: {
type: 'string',
description: 'Mailing ZIP code'
},
Phone1: {
type: 'string',
description: 'Primary phone number'
},
Phone2: {
type: 'string',
description: 'Secondary phone number'
},
Fax: {
type: 'string',
description: 'Fax number'
},
ContactPerson: {
type: 'string',
description: 'Contact person name'
},
Notes: {
type: 'string',
description: 'Notes'
},
EmailAddress: {
type: 'string',
description: 'Email address'
},
Website: {
type: 'string',
description: 'Website URL'
},
Currency: {
type: 'string',
description: 'Default currency code'
},
Valid: {
type: 'string',
enum: ['tYES', 'tNO'],
description: 'Whether the business partner is valid'
},
Frozen: {
type: 'string',
enum: ['tYES', 'tNO'],
description: 'Whether the business partner is frozen'
}
},
required: ['CardName', 'CardType'],
additionalProperties: false
}
},
{
name: 'sap_update_business_partner',
description: 'Update an existing business partner in SAP Business One.',
inputSchema: {
type: 'object',
properties: {
CardCode: {
type: 'string',
description: 'Business partner code to update'
},
updates: {
type: 'object',
properties: {
CardName: { type: 'string' },
GroupCode: { type: 'number' },
Address: { type: 'string' },
ZipCode: { type: 'string' },
MailAddress: { type: 'string' },
MailZipCode: { type: 'string' },
Phone1: { type: 'string' },
Phone2: { type: 'string' },
Fax: { type: 'string' },
ContactPerson: { type: 'string' },
Notes: { type: 'string' },
EmailAddress: { type: 'string' },
Website: { type: 'string' },
Currency: { type: 'string' },
Valid: { type: 'string', enum: ['tYES', 'tNO'] },
Frozen: { type: 'string', enum: ['tYES', 'tNO'] }
},
description: 'Fields to update'
}
},
required: ['CardCode', 'updates'],
additionalProperties: false
}
},
{
name: 'sap_get_items',
description: 'Retrieve items from SAP Business One with optional filtering, selection, and pagination. Server limit: 20 records maximum per request. Use skip/top for pagination.',
inputSchema: {
type: 'object',
properties: {
filter: {
type: 'string',
description: 'OData $filter expression (e.g., "ItemType eq \'it_Item\'" or "contains(ItemName,\'Laptop\')")'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields (e.g., "ItemCode,ItemName,QuantityOnStock")'
},
orderby: {
type: 'string',
description: 'OData $orderby expression (e.g., "ItemName asc" or "QuantityOnStock desc")'
},
top: {
type: 'number',
description: 'Maximum number of records to return (server limit: 20, use 20 for best performance)'
},
skip: {
type: 'number',
description: 'Number of records to skip for pagination (0-based, e.g., skip=20 for page 2, skip=40 for page 3)'
}
},
additionalProperties: false
}
},
{
name: 'sap_get_item',
description: 'Retrieve a single item by ItemCode from SAP Business One.',
inputSchema: {
type: 'object',
properties: {
itemCode: {
type: 'string',
description: 'Item code (ItemCode)'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields (e.g., "ItemCode,ItemName,QuantityOnStock")'
},
expand: {
type: 'string',
description: 'OData $expand expression to include related data'
}
},
required: ['itemCode'],
additionalProperties: false
}
},
{
name: 'sap_get_product_categories',
description: 'Retrieve product categories (SAP Item Groups) with optional filtering, selection, and pagination. Server limit: 20 records maximum per request. Use skip/top for pagination.',
inputSchema: {
type: 'object',
properties: {
filter: {
type: 'string',
description: 'OData $filter expression (e.g., "contains(GroupName,\'Hardware\')")'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields (e.g., "Number,GroupName")'
},
orderby: {
type: 'string',
description: 'OData $orderby expression (e.g., "GroupName asc")'
},
top: {
type: 'number',
description: 'Maximum number of records to return (server limit: 20, use 20 for best performance)'
},
skip: {
type: 'number',
description: 'Number of records to skip for pagination (0-based, e.g., skip=20 for page 2, skip=40 for page 3)'
}
},
additionalProperties: false
}
},
{
name: 'sap_create_item',
description: 'Create a new item in SAP Business One.',
inputSchema: {
type: 'object',
properties: {
ItemName: {
type: 'string',
description: 'Item name (required)'
},
ForeignName: {
type: 'string',
description: 'Foreign language name'
},
ItemsGroupCode: {
type: 'number',
description: 'Item group code'
},
BarCode: {
type: 'string',
description: 'Barcode'
},
VatLiable: {
type: 'string',
enum: ['tYES', 'tNO'],
description: 'VAT liable'
},
PurchaseItem: {
type: 'string',
enum: ['tYES', 'tNO'],
description: 'Can be purchased'
},
SalesItem: {
type: 'string',
enum: ['tYES', 'tNO'],
description: 'Can be sold'
},
InventoryItem: {
type: 'string',
enum: ['tYES', 'tNO'],
description: 'Inventory item'
},
IncomeAccount: {
type: 'string',
description: 'Income account code'
},
ExemptIncomeAccount: {
type: 'string',
description: 'Exempt income account code'
},
ExpanseAccount: {
type: 'string',
description: 'Expense account code'
},
Mainsupplier: {
type: 'string',
description: 'Main supplier code'
},
SupplierCatalogNo: {
type: 'string',
description: 'Supplier catalog number'
},
DesiredInventory: {
type: 'number',
description: 'Desired inventory level'
},
MinInventory: {
type: 'number',
description: 'Minimum inventory level'
},
CommissionPercent: {
type: 'number',
description: 'Commission percentage'
},
Valid: {
type: 'string',
enum: ['tYES', 'tNO'],
description: 'Whether the item is valid'
},
Frozen: {
type: 'string',
enum: ['tYES', 'tNO'],
description: 'Whether the item is frozen'
}
},
required: ['ItemName'],
additionalProperties: false
}
},
{
name: 'sap_get_warehouses',
description: 'Retrieve warehouses from SAP Business One with optional filtering, selection, and pagination. Supports OData query options for efficient data retrieval.',
inputSchema: {
type: 'object',
properties: {
filter: {
type: 'string',
description: 'OData $filter expression (e.g., "Inactive eq \'tNO\'" or "contains(WarehouseName,\'Main\')")'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields (e.g., "WarehouseCode,WarehouseName,Inactive")'
},
orderby: {
type: 'string',
description: 'OData $orderby expression (e.g., "WarehouseName asc" or "WarehouseCode desc")'
},
top: {
type: 'number',
description: 'Maximum number of records to return'
},
skip: {
type: 'number',
description: 'Number of records to skip for pagination'
}
},
additionalProperties: false
}
},
{
name: 'sap_get_warehouse',
description: 'Retrieve a single warehouse by warehouse code from SAP Business One with optional field selection.',
inputSchema: {
type: 'object',
properties: {
warehouseCode: {
type: 'string',
description: 'Warehouse code (required)'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields'
},
expand: {
type: 'string',
description: 'OData $expand expression to include related data'
}
},
required: ['warehouseCode'],
additionalProperties: false
}
},
{
name: 'sap_get_pricelists',
description: 'Retrieve price lists from SAP Business One with optional filtering, selection, and pagination. Supports OData query options for efficient data retrieval.',
inputSchema: {
type: 'object',
properties: {
filter: {
type: 'string',
description: 'OData $filter expression (e.g., "Active eq \'tYES\'" or "contains(PriceListName,\'Standard\')")'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields (e.g., "PriceListNo,PriceListName,Active")'
},
orderby: {
type: 'string',
description: 'OData $orderby expression (e.g., "PriceListName asc" or "PriceListNo desc")'
},
top: {
type: 'number',
description: 'Maximum number of records to return'
},
skip: {
type: 'number',
description: 'Number of records to skip for pagination'
}
},
additionalProperties: false
}
},
{
name: 'sap_get_pricelist',
description: 'Retrieve a single price list by price list number from SAP Business One with optional field selection.',
inputSchema: {
type: 'object',
properties: {
priceListNo: {
type: 'number',
description: 'Price list number (required)'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields'
},
expand: {
type: 'string',
description: 'OData $expand expression to include related data'
}
},
required: ['priceListNo'],
additionalProperties: false
}
},
{
name: 'sap_get_item_stock',
description: 'Get stock levels for a specific item in a specific warehouse from SAP Business One.',
inputSchema: {
type: 'object',
properties: {
itemCode: {
type: 'string',
description: 'Item code (required)'
},
warehouseCode: {
type: 'string',
description: 'Warehouse code (required)'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields (e.g., "InStock,Available,Committed")'
}
},
required: ['itemCode', 'warehouseCode'],
additionalProperties: false
}
},
{
name: 'sap_get_item_stock_all',
description: 'Get stock levels for a specific item across all warehouses from SAP Business One with optional filtering and pagination.',
inputSchema: {
type: 'object',
properties: {
itemCode: {
type: 'string',
description: 'Item code (required)'
},
filter: {
type: 'string',
description: 'OData $filter expression to filter warehouses'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields'
},
orderby: {
type: 'string',
description: 'OData $orderby expression (e.g., "WarehouseCode asc")'
},
top: {
type: 'number',
description: 'Maximum number of records to return'
},
skip: {
type: 'number',
description: 'Number of records to skip for pagination'
}
},
required: ['itemCode'],
additionalProperties: false
}
},
{
name: 'sap_get_item_price',
description: 'Get price for a specific item in a specific price list from SAP Business One.',
inputSchema: {
type: 'object',
properties: {
itemCode: {
type: 'string',
description: 'Item code (required)'
},
priceListId: {
type: 'number',
description: 'Price list ID (required)'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields (e.g., "Price,Currency,Factor")'
}
},
required: ['itemCode', 'priceListId'],
additionalProperties: false
}
},
{
name: 'sap_get_item_prices_all',
description: 'Get prices for a specific item across all price lists from SAP Business One with optional filtering and pagination.',
inputSchema: {
type: 'object',
properties: {
itemCode: {
type: 'string',
description: 'Item code (required)'
},
filter: {
type: 'string',
description: 'OData $filter expression to filter price lists'
},
select: {
type: 'string',
description: 'OData $select expression to specify fields'
},
orderby: {
type: 'string',
description: 'OData $orderby expression (e.g., "PriceList asc")'
},
top: {
type: 'number',
description: 'Maximum number of records to return'
},
skip: {
type: 'number',
description: 'Number of records to skip for pagination'
}
},
required: ['itemCode'],
additionalProperties: false
}
}
];
export class MasterDataToolHandler {
sapClient;
constructor(sapClient) {
this.sapClient = sapClient;
}
async handleGetBusinessPartners(args) {
try {
const params = getBusinessPartnersSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.filter)
queryParams.$filter = params.filter;
if (params.select)
queryParams.$select = params.select;
if (params.orderby)
queryParams.$orderby = params.orderby;
if (params.top)
queryParams.$top = params.top;
if (params.skip)
queryParams.$skip = params.skip;
// Add card type filter if specified
if (params.cardType) {
const typeFilter = `CardType eq '${params.cardType}'`;
queryParams.$filter = queryParams.$filter
? `(${queryParams.$filter}) and ${typeFilter}`
: typeFilter;
}
const businessPartners = await this.sapClient.getBusinessPartners(queryParams);
return {
success: true,
count: businessPartners.length,
data: businessPartners
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve business partners',
details: 'Check your filter syntax and ensure the session is valid'
};
}
}
async handleGetBusinessPartner(args) {
try {
const params = getBusinessPartnerSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.select)
queryParams.$select = params.select;
if (params.expand)
queryParams.$expand = params.expand;
const businessPartner = await this.sapClient.getBusinessPartner(params.cardCode, queryParams);
return {
success: true,
data: businessPartner
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve business partner',
details: 'Check the CardCode and ensure the session is valid'
};
}
}
async handleCreateBusinessPartner(args) {
try {
const businessPartner = createBusinessPartnerSchema.parse(args);
const result = await this.sapClient.createBusinessPartner(businessPartner);
return {
success: true,
message: 'Business partner created successfully',
data: {
CardCode: result.CardCode,
CardName: result.CardName,
CardType: result.CardType
}
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to create business partner',
details: 'Check required fields and ensure the session is valid'
};
}
}
async handleUpdateBusinessPartner(args) {
try {
const { CardCode, updates } = updateBusinessPartnerSchema.parse(args);
await this.sapClient.updateBusinessPartner(CardCode, updates);
return {
success: true,
message: `Business partner ${CardCode} updated successfully`
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to update business partner',
details: 'Check the CardCode exists and field values are valid'
};
}
}
async handleGetItems(args) {
try {
const params = getItemsSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.filter)
queryParams.$filter = params.filter;
if (params.select)
queryParams.$select = params.select;
if (params.orderby)
queryParams.$orderby = params.orderby;
if (params.top)
queryParams.$top = params.top;
if (params.skip)
queryParams.$skip = params.skip;
const items = await this.sapClient.getItems(queryParams);
return {
success: true,
count: items.length,
data: items
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve items',
details: 'Check your filter syntax and ensure the session is valid'
};
}
}
async handleGetItem(args) {
try {
const params = getItemSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.select)
queryParams.$select = params.select;
if (params.expand)
queryParams.$expand = params.expand;
const item = await this.sapClient.getItem(params.itemCode, queryParams);
return {
success: true,
data: item
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve item',
details: 'Check the ItemCode and ensure the session is valid'
};
}
}
async handleGetItemGroups(args) {
try {
const params = getItemGroupsSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.filter)
queryParams.$filter = params.filter;
if (params.select)
queryParams.$select = params.select;
if (params.orderby)
queryParams.$orderby = params.orderby;
if (params.top)
queryParams.$top = params.top;
if (params.skip)
queryParams.$skip = params.skip;
const groups = await this.sapClient.getItemGroups(queryParams);
return {
success: true,
count: groups.length,
data: groups
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve product categories',
details: 'Check your filter syntax and ensure the session is valid'
};
}
}
async handleCreateItem(args) {
try {
const item = createItemSchema.parse(args);
const result = await this.sapClient.createItem(item);
return {
success: true,
message: 'Item created successfully',
data: {
ItemCode: result.ItemCode,
ItemName: result.ItemName,
SalesItem: result.SalesItem,
PurchaseItem: result.PurchaseItem,
InventoryItem: result.InventoryItem
}
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to create item',
details: 'Check required fields and ensure the session is valid'
};
}
}
async handleGetWarehouses(args) {
try {
const params = getWarehousesSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.filter)
queryParams.$filter = params.filter;
if (params.select)
queryParams.$select = params.select;
if (params.orderby)
queryParams.$orderby = params.orderby;
if (params.top)
queryParams.$top = params.top;
if (params.skip)
queryParams.$skip = params.skip;
const warehouses = await this.sapClient.getWarehouses(queryParams);
return {
success: true,
count: warehouses.length,
data: warehouses
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve warehouses',
details: 'Check your filter syntax and ensure the session is valid'
};
}
}
async handleGetWarehouse(args) {
try {
const params = getWarehouseSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.select)
queryParams.$select = params.select;
if (params.expand)
queryParams.$expand = params.expand;
const warehouse = await this.sapClient.getWarehouse(params.warehouseCode, queryParams);
return {
success: true,
data: warehouse
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve warehouse',
details: 'Check the WarehouseCode and ensure the session is valid'
};
}
}
async handleGetPriceLists(args) {
try {
const params = getPriceListsSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.filter)
queryParams.$filter = params.filter;
if (params.select)
queryParams.$select = params.select;
if (params.orderby)
queryParams.$orderby = params.orderby;
if (params.top)
queryParams.$top = params.top;
if (params.skip)
queryParams.$skip = params.skip;
const priceLists = await this.sapClient.getPriceLists(queryParams);
return {
success: true,
count: priceLists.length,
data: priceLists
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve price lists',
details: 'Check your filter syntax and ensure the session is valid'
};
}
}
async handleGetPriceList(args) {
try {
const params = getPriceListSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.select)
queryParams.$select = params.select;
if (params.expand)
queryParams.$expand = params.expand;
const priceList = await this.sapClient.getPriceList(params.priceListNo, queryParams);
return {
success: true,
data: priceList
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve price list',
details: 'Check the PriceListNo and ensure the session is valid'
};
}
}
async handleGetItemStock(args) {
try {
const params = getItemStockSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.select)
queryParams.$select = params.select;
const stockInfo = await this.sapClient.getItemStock(params.itemCode, params.warehouseCode, queryParams);
return {
success: true,
data: stockInfo
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve item stock information',
details: 'Check the ItemCode and WarehouseCode and ensure the session is valid'
};
}
}
async handleGetItemStockAll(args) {
try {
const params = getItemStockAllSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.filter)
queryParams.$filter = params.filter;
if (params.select)
queryParams.$select = params.select;
if (params.orderby)
queryParams.$orderby = params.orderby;
if (params.top)
queryParams.$top = params.top;
if (params.skip)
queryParams.$skip = params.skip;
const stockInfo = await this.sapClient.getItemStockAll(params.itemCode, queryParams);
return {
success: true,
count: stockInfo.length,
data: stockInfo
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve item stock information',
details: 'Check the ItemCode and ensure the session is valid'
};
}
}
async handleGetItemPrice(args) {
try {
const params = getItemPriceSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.select)
queryParams.$select = params.select;
const priceInfo = await this.sapClient.getItemPrice(params.itemCode, params.priceListId, queryParams);
return {
success: true,
data: priceInfo
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve item price information',
details: 'Check the ItemCode and PriceListId and ensure the session is valid'
};
}
}
async handleGetItemPricesAll(args) {
try {
const params = getItemPricesAllSchema.parse(args);
// Build query parameters
const queryParams = {};
if (params.filter)
queryParams.$filter = params.filter;
if (params.select)
queryParams.$select = params.select;
if (params.orderby)
queryParams.$orderby = params.orderby;
if (params.top)
queryParams.$top = params.top;
if (params.skip)
queryParams.$skip = params.skip;
const priceInfo = await this.sapClient.getItemPricesAll(params.itemCode, queryParams);
return {
success: true,
count: priceInfo.length,
data: priceInfo
};
}
catch (error) {
return {
success: false,
error: error.message || 'Failed to retrieve item price information',
details: 'Check the ItemCode and ensure the session is valid'
};
}
}
}
//# sourceMappingURL=master-data.js.map