ebay-mcp 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +586 -0
- package/build/api/account-management/account.d.ts +216 -0
- package/build/api/account-management/account.js +305 -0
- package/build/api/analytics-and-report/analytics.d.ts +33 -0
- package/build/api/analytics-and-report/analytics.js +102 -0
- package/build/api/client.d.ts +89 -0
- package/build/api/client.js +343 -0
- package/build/api/communication/feedback.d.ts +45 -0
- package/build/api/communication/feedback.js +119 -0
- package/build/api/communication/message.d.ts +55 -0
- package/build/api/communication/message.js +131 -0
- package/build/api/communication/negotiation.d.ts +39 -0
- package/build/api/communication/negotiation.js +97 -0
- package/build/api/communication/notification.d.ts +128 -0
- package/build/api/communication/notification.js +373 -0
- package/build/api/index.d.ts +96 -0
- package/build/api/index.js +121 -0
- package/build/api/listing-management/inventory.d.ts +216 -0
- package/build/api/listing-management/inventory.js +633 -0
- package/build/api/listing-metadata/metadata.d.ts +154 -0
- package/build/api/listing-metadata/metadata.js +485 -0
- package/build/api/listing-metadata/taxonomy.d.ts +38 -0
- package/build/api/listing-metadata/taxonomy.js +58 -0
- package/build/api/marketing-and-promotions/marketing.d.ts +395 -0
- package/build/api/marketing-and-promotions/marketing.js +565 -0
- package/build/api/marketing-and-promotions/recommendation.d.ts +20 -0
- package/build/api/marketing-and-promotions/recommendation.js +32 -0
- package/build/api/order-management/dispute.d.ts +65 -0
- package/build/api/order-management/dispute.js +69 -0
- package/build/api/order-management/fulfillment.d.ts +80 -0
- package/build/api/order-management/fulfillment.js +89 -0
- package/build/api/other/compliance.d.ts +26 -0
- package/build/api/other/compliance.js +47 -0
- package/build/api/other/edelivery.d.ts +153 -0
- package/build/api/other/edelivery.js +219 -0
- package/build/api/other/identity.d.ts +17 -0
- package/build/api/other/identity.js +24 -0
- package/build/api/other/translation.d.ts +14 -0
- package/build/api/other/translation.js +22 -0
- package/build/api/other/vero.d.ts +30 -0
- package/build/api/other/vero.js +48 -0
- package/build/auth/oauth-metadata.d.ts +46 -0
- package/build/auth/oauth-metadata.js +59 -0
- package/build/auth/oauth-middleware.d.ts +35 -0
- package/build/auth/oauth-middleware.js +99 -0
- package/build/auth/oauth-types.d.ts +66 -0
- package/build/auth/oauth-types.js +4 -0
- package/build/auth/oauth.d.ts +93 -0
- package/build/auth/oauth.js +383 -0
- package/build/auth/scope-utils.d.ts +70 -0
- package/build/auth/scope-utils.js +304 -0
- package/build/auth/token-verifier.d.ts +57 -0
- package/build/auth/token-verifier.js +172 -0
- package/build/config/environment.d.ts +61 -0
- package/build/config/environment.js +260 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +98 -0
- package/build/schemas/account-management/account.d.ts +5324 -0
- package/build/schemas/account-management/account.js +366 -0
- package/build/schemas/analytics/analytics.d.ts +167 -0
- package/build/schemas/analytics/analytics.js +191 -0
- package/build/schemas/communication/messages.d.ts +1872 -0
- package/build/schemas/communication/messages.js +348 -0
- package/build/schemas/fulfillment/orders.d.ts +4655 -0
- package/build/schemas/fulfillment/orders.js +317 -0
- package/build/schemas/index.d.ts +2100 -0
- package/build/schemas/index.js +68 -0
- package/build/schemas/inventory-management/inventory.d.ts +6419 -0
- package/build/schemas/inventory-management/inventory.js +450 -0
- package/build/schemas/marketing/marketing.d.ts +14181 -0
- package/build/schemas/marketing/marketing.js +1088 -0
- package/build/schemas/metadata/metadata.d.ts +5259 -0
- package/build/schemas/metadata/metadata.js +614 -0
- package/build/schemas/other/other-apis.d.ts +257 -0
- package/build/schemas/other/other-apis.js +372 -0
- package/build/schemas/taxonomy/taxonomy.d.ts +215 -0
- package/build/schemas/taxonomy/taxonomy.js +571 -0
- package/build/scripts/auto-setup.d.ts +12 -0
- package/build/scripts/auto-setup.js +277 -0
- package/build/scripts/diagnostics.d.ts +8 -0
- package/build/scripts/diagnostics.js +299 -0
- package/build/scripts/download-specs.d.ts +1 -0
- package/build/scripts/download-specs.js +116 -0
- package/build/scripts/interactive-setup.d.ts +21 -0
- package/build/scripts/interactive-setup.js +723 -0
- package/build/server-http.d.ts +11 -0
- package/build/server-http.js +361 -0
- package/build/tools/definitions/account-with-schemas.d.ts +39 -0
- package/build/tools/definitions/account-with-schemas.js +170 -0
- package/build/tools/definitions/account.d.ts +12 -0
- package/build/tools/definitions/account.js +428 -0
- package/build/tools/definitions/analytics.d.ts +25 -0
- package/build/tools/definitions/analytics.js +66 -0
- package/build/tools/definitions/communication.d.ts +12 -0
- package/build/tools/definitions/communication.js +151 -0
- package/build/tools/definitions/fulfillment.d.ts +12 -0
- package/build/tools/definitions/fulfillment.js +326 -0
- package/build/tools/definitions/index.d.ts +25 -0
- package/build/tools/definitions/index.js +37 -0
- package/build/tools/definitions/inventory.d.ts +12 -0
- package/build/tools/definitions/inventory.js +429 -0
- package/build/tools/definitions/marketing.d.ts +12 -0
- package/build/tools/definitions/marketing.js +1095 -0
- package/build/tools/definitions/metadata.d.ts +12 -0
- package/build/tools/definitions/metadata.js +188 -0
- package/build/tools/definitions/other.d.ts +13 -0
- package/build/tools/definitions/other.js +309 -0
- package/build/tools/definitions/taxonomy.d.ts +25 -0
- package/build/tools/definitions/taxonomy.js +64 -0
- package/build/tools/definitions/token-management.d.ts +35 -0
- package/build/tools/definitions/token-management.js +103 -0
- package/build/tools/index.d.ts +11 -0
- package/build/tools/index.js +1003 -0
- package/build/tools/schemas.d.ts +14764 -0
- package/build/tools/schemas.js +667 -0
- package/build/tools/tool-definitions.d.ts +35 -0
- package/build/tools/tool-definitions.js +3534 -0
- package/build/types/application-settings/developerAnalyticsV1BetaOas3.d.ts +197 -0
- package/build/types/application-settings/developerAnalyticsV1BetaOas3.js +5 -0
- package/build/types/application-settings/developerClientRegistrationV1Oas3.d.ts +155 -0
- package/build/types/application-settings/developerClientRegistrationV1Oas3.js +5 -0
- package/build/types/application-settings/developerKeyManagementV1Oas3.d.ts +246 -0
- package/build/types/application-settings/developerKeyManagementV1Oas3.js +5 -0
- package/build/types/ebay-enums.d.ts +1204 -0
- package/build/types/ebay-enums.js +1330 -0
- package/build/types/ebay.d.ts +143 -0
- package/build/types/ebay.js +123 -0
- package/build/types/index.d.ts +6 -0
- package/build/types/index.js +10 -0
- package/build/types/sell-apps/account-management/sellAccountV1Oas3.d.ts +2579 -0
- package/build/types/sell-apps/account-management/sellAccountV1Oas3.js +5 -0
- package/build/types/sell-apps/analytics-and-report/sellAnalyticsV1Oas3.d.ts +446 -0
- package/build/types/sell-apps/analytics-and-report/sellAnalyticsV1Oas3.js +5 -0
- package/build/types/sell-apps/communication/commerceFeedbackV1BetaOas3.d.ts +705 -0
- package/build/types/sell-apps/communication/commerceFeedbackV1BetaOas3.js +5 -0
- package/build/types/sell-apps/communication/commerceMessageV1Oas3.d.ts +590 -0
- package/build/types/sell-apps/communication/commerceMessageV1Oas3.js +5 -0
- package/build/types/sell-apps/communication/commerceNotificationV1Oas3.d.ts +1276 -0
- package/build/types/sell-apps/communication/commerceNotificationV1Oas3.js +5 -0
- package/build/types/sell-apps/communication/sellNegotiationV1Oas3.d.ts +277 -0
- package/build/types/sell-apps/communication/sellNegotiationV1Oas3.js +5 -0
- package/build/types/sell-apps/listing-management/sellInventoryV1Oas3.d.ts +3133 -0
- package/build/types/sell-apps/listing-management/sellInventoryV1Oas3.js +5 -0
- package/build/types/sell-apps/listing-metadata/sellMetadataV1Oas3.d.ts +2289 -0
- package/build/types/sell-apps/listing-metadata/sellMetadataV1Oas3.js +5 -0
- package/build/types/sell-apps/markeitng-and-promotions/sellMarketingV1Oas3.d.ts +6650 -0
- package/build/types/sell-apps/markeitng-and-promotions/sellMarketingV1Oas3.js +5 -0
- package/build/types/sell-apps/markeitng-and-promotions/sellRecommendationV1Oas3.d.ts +172 -0
- package/build/types/sell-apps/markeitng-and-promotions/sellRecommendationV1Oas3.js +5 -0
- package/build/types/sell-apps/order-management/sellFulfillmentV1Oas3.d.ts +1869 -0
- package/build/types/sell-apps/order-management/sellFulfillmentV1Oas3.js +5 -0
- package/build/types/sell-apps/other-apis/commerceIdentityV1Oas3.d.ts +178 -0
- package/build/types/sell-apps/other-apis/commerceIdentityV1Oas3.js +5 -0
- package/build/types/sell-apps/other-apis/commerceTranslationV1BetaOas3.d.ts +128 -0
- package/build/types/sell-apps/other-apis/commerceTranslationV1BetaOas3.js +5 -0
- package/build/types/sell-apps/other-apis/commerceVeroV1Oas3.d.ts +417 -0
- package/build/types/sell-apps/other-apis/commerceVeroV1Oas3.js +5 -0
- package/build/types/sell-apps/other-apis/sellComplianceV1Oas3.d.ts +273 -0
- package/build/types/sell-apps/other-apis/sellComplianceV1Oas3.js +5 -0
- package/build/types/sell-apps/other-apis/sellEdeliveryInternationalShippingOas3.d.ts +2537 -0
- package/build/types/sell-apps/other-apis/sellEdeliveryInternationalShippingOas3.js +5 -0
- package/build/types/sell-apps/other-apis/sellMarketingV1Oas3.d.ts +6650 -0
- package/build/types/sell-apps/other-apis/sellMarketingV1Oas3.js +5 -0
- package/build/types/sell-apps/other-apis/sellRecommendationV1Oas3.d.ts +172 -0
- package/build/types/sell-apps/other-apis/sellRecommendationV1Oas3.js +5 -0
- package/build/utils/account-management/account.d.ts +1094 -0
- package/build/utils/account-management/account.js +831 -0
- package/build/utils/communication/feedback.d.ts +152 -0
- package/build/utils/communication/feedback.js +216 -0
- package/build/utils/communication/message.d.ts +174 -0
- package/build/utils/communication/message.js +242 -0
- package/build/utils/communication/negotiation.d.ts +123 -0
- package/build/utils/communication/negotiation.js +150 -0
- package/build/utils/communication/notification.d.ts +370 -0
- package/build/utils/communication/notification.js +369 -0
- package/build/utils/date-converter.d.ts +59 -0
- package/build/utils/date-converter.js +160 -0
- package/build/utils/llm-client-detector.d.ts +54 -0
- package/build/utils/llm-client-detector.js +318 -0
- package/build/utils/oauth-helper.d.ts +37 -0
- package/build/utils/oauth-helper.js +315 -0
- package/build/utils/order-management/dispute.d.ts +346 -0
- package/build/utils/order-management/dispute.js +369 -0
- package/build/utils/order-management/fulfillment.d.ts +200 -0
- package/build/utils/order-management/fulfillment.js +205 -0
- package/build/utils/other/compliance.d.ts +49 -0
- package/build/utils/other/compliance.js +76 -0
- package/build/utils/other/edelivery.d.ts +310 -0
- package/build/utils/other/edelivery.js +241 -0
- package/build/utils/other/identity.d.ts +13 -0
- package/build/utils/other/identity.js +13 -0
- package/build/utils/other/translation.d.ts +28 -0
- package/build/utils/other/translation.js +41 -0
- package/build/utils/other/vero.d.ts +61 -0
- package/build/utils/other/vero.js +90 -0
- package/build/utils/scope-helper.d.ts +49 -0
- package/build/utils/scope-helper.js +207 -0
- package/build/utils/security-checker.d.ts +46 -0
- package/build/utils/security-checker.js +248 -0
- package/build/utils/setup-validator.d.ts +25 -0
- package/build/utils/setup-validator.js +305 -0
- package/build/utils/token-utils.d.ts +40 -0
- package/build/utils/token-utils.js +40 -0
- package/package.json +115 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Client Detection and Auto-Configuration
|
|
3
|
+
*
|
|
4
|
+
* Detects installed LLM clients and provides utilities to auto-configure them
|
|
5
|
+
* with the eBay MCP server settings.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
8
|
+
import { join, dirname } from 'path';
|
|
9
|
+
import { homedir, platform } from 'os';
|
|
10
|
+
/**
|
|
11
|
+
* Get the config file path for Claude Desktop based on OS
|
|
12
|
+
*/
|
|
13
|
+
function getClaudeConfigPath() {
|
|
14
|
+
const os = platform();
|
|
15
|
+
const home = homedir();
|
|
16
|
+
switch (os) {
|
|
17
|
+
case 'darwin': // macOS
|
|
18
|
+
return join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
|
|
19
|
+
case 'win32': // Windows
|
|
20
|
+
return join(home, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json');
|
|
21
|
+
case 'linux':
|
|
22
|
+
return join(home, '.config', 'Claude', 'claude_desktop_config.json');
|
|
23
|
+
default:
|
|
24
|
+
return join(home, '.config', 'Claude', 'claude_desktop_config.json');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the config file path for Cline (VSCode extension)
|
|
29
|
+
*/
|
|
30
|
+
function getClineConfigPath() {
|
|
31
|
+
const home = homedir();
|
|
32
|
+
const os = platform();
|
|
33
|
+
switch (os) {
|
|
34
|
+
case 'darwin':
|
|
35
|
+
return join(home, 'Library', 'Application Support', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');
|
|
36
|
+
case 'win32':
|
|
37
|
+
return join(home, 'AppData', 'Roaming', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');
|
|
38
|
+
default:
|
|
39
|
+
return join(home, '.config', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get config path for Continue.dev
|
|
44
|
+
*/
|
|
45
|
+
function getContinueConfigPath() {
|
|
46
|
+
const home = homedir();
|
|
47
|
+
return join(home, '.continue', 'config.json');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Detect all available LLM clients
|
|
51
|
+
*/
|
|
52
|
+
export function detectLLMClients() {
|
|
53
|
+
const clients = [
|
|
54
|
+
{
|
|
55
|
+
name: 'claude',
|
|
56
|
+
displayName: 'Claude Desktop',
|
|
57
|
+
configPath: getClaudeConfigPath(),
|
|
58
|
+
detected: false,
|
|
59
|
+
configExists: false,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'cline',
|
|
63
|
+
displayName: 'Cline (VSCode Extension)',
|
|
64
|
+
configPath: getClineConfigPath(),
|
|
65
|
+
detected: false,
|
|
66
|
+
configExists: false,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'continue',
|
|
70
|
+
displayName: 'Continue.dev',
|
|
71
|
+
configPath: getContinueConfigPath(),
|
|
72
|
+
detected: false,
|
|
73
|
+
configExists: false,
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
// Check which clients exist
|
|
77
|
+
for (const client of clients) {
|
|
78
|
+
client.configExists = existsSync(client.configPath);
|
|
79
|
+
// Check if parent directory exists (indicates app is installed)
|
|
80
|
+
const parentDir = dirname(client.configPath);
|
|
81
|
+
client.detected = existsSync(parentDir);
|
|
82
|
+
}
|
|
83
|
+
return clients;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Read and parse JSON config file safely
|
|
87
|
+
*/
|
|
88
|
+
function readJSONConfig(path) {
|
|
89
|
+
try {
|
|
90
|
+
if (!existsSync(path)) {
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
const content = readFileSync(path, 'utf-8');
|
|
94
|
+
return JSON.parse(content);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return {};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Write JSON config file safely
|
|
102
|
+
*/
|
|
103
|
+
function writeJSONConfig(path, config) {
|
|
104
|
+
// Ensure directory exists
|
|
105
|
+
const dir = dirname(path);
|
|
106
|
+
if (!existsSync(dir)) {
|
|
107
|
+
mkdirSync(dir, { recursive: true });
|
|
108
|
+
}
|
|
109
|
+
writeFileSync(path, JSON.stringify(config, null, 2), 'utf-8');
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Configure Claude Desktop with eBay MCP server
|
|
113
|
+
*/
|
|
114
|
+
export function configureClaudeDesktop(projectRoot) {
|
|
115
|
+
try {
|
|
116
|
+
const configPath = getClaudeConfigPath();
|
|
117
|
+
const config = readJSONConfig(configPath);
|
|
118
|
+
// Initialize mcpServers if it doesn't exist
|
|
119
|
+
if (!config.mcpServers || typeof config.mcpServers !== 'object') {
|
|
120
|
+
config.mcpServers = {};
|
|
121
|
+
}
|
|
122
|
+
const mcpServers = config.mcpServers;
|
|
123
|
+
// Add or update eBay MCP server configuration
|
|
124
|
+
mcpServers['ebay-mcp-server'] = {
|
|
125
|
+
command: 'node',
|
|
126
|
+
args: [join(projectRoot, 'build', 'index.js')],
|
|
127
|
+
};
|
|
128
|
+
config.mcpServers = mcpServers;
|
|
129
|
+
writeJSONConfig(configPath, config);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error('Failed to configure Claude Desktop:', error);
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Configure Cline (VSCode extension) with eBay MCP server
|
|
139
|
+
*/
|
|
140
|
+
export function configureCline(projectRoot) {
|
|
141
|
+
try {
|
|
142
|
+
const configPath = getClineConfigPath();
|
|
143
|
+
const config = readJSONConfig(configPath);
|
|
144
|
+
// Initialize mcpServers if it doesn't exist
|
|
145
|
+
if (!config.mcpServers || typeof config.mcpServers !== 'object') {
|
|
146
|
+
config.mcpServers = {};
|
|
147
|
+
}
|
|
148
|
+
const mcpServers = config.mcpServers;
|
|
149
|
+
// Add or update eBay MCP server configuration
|
|
150
|
+
mcpServers['ebay-mcp-server'] = {
|
|
151
|
+
command: 'node',
|
|
152
|
+
args: [join(projectRoot, 'build', 'index.js')],
|
|
153
|
+
};
|
|
154
|
+
config.mcpServers = mcpServers;
|
|
155
|
+
writeJSONConfig(configPath, config);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error('Failed to configure Cline:', error);
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Configure Continue.dev with eBay MCP server
|
|
165
|
+
*/
|
|
166
|
+
export function configureContinue(projectRoot) {
|
|
167
|
+
try {
|
|
168
|
+
const configPath = getContinueConfigPath();
|
|
169
|
+
const config = readJSONConfig(configPath);
|
|
170
|
+
// Initialize experimental.modelContextProtocolServers if it doesn't exist
|
|
171
|
+
if (!config.experimental || typeof config.experimental !== 'object') {
|
|
172
|
+
config.experimental = {};
|
|
173
|
+
}
|
|
174
|
+
const experimental = config.experimental;
|
|
175
|
+
if (!experimental.modelContextProtocolServers ||
|
|
176
|
+
!Array.isArray(experimental.modelContextProtocolServers)) {
|
|
177
|
+
experimental.modelContextProtocolServers = [];
|
|
178
|
+
}
|
|
179
|
+
const mcpServers = experimental.modelContextProtocolServers;
|
|
180
|
+
// Check if eBay server already exists
|
|
181
|
+
const existingIndex = mcpServers.findIndex((server) => server.command === 'node' && server.args?.[0]?.includes('ebay-mcp'));
|
|
182
|
+
const serverConfig = {
|
|
183
|
+
command: 'node',
|
|
184
|
+
args: [join(projectRoot, 'build', 'index.js')],
|
|
185
|
+
};
|
|
186
|
+
if (existingIndex >= 0) {
|
|
187
|
+
mcpServers[existingIndex] = serverConfig;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
mcpServers.push(serverConfig);
|
|
191
|
+
}
|
|
192
|
+
experimental.modelContextProtocolServers = mcpServers;
|
|
193
|
+
config.experimental = experimental;
|
|
194
|
+
writeJSONConfig(configPath, config);
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error('Failed to configure Continue.dev:', error);
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Configure specified LLM client
|
|
204
|
+
*/
|
|
205
|
+
export function configureLLMClient(clientName, projectRoot) {
|
|
206
|
+
switch (clientName) {
|
|
207
|
+
case 'claude':
|
|
208
|
+
return configureClaudeDesktop(projectRoot);
|
|
209
|
+
case 'cline':
|
|
210
|
+
return configureCline(projectRoot);
|
|
211
|
+
case 'continue':
|
|
212
|
+
return configureContinue(projectRoot);
|
|
213
|
+
default:
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get human-readable instructions for manual configuration
|
|
219
|
+
*/
|
|
220
|
+
export function getManualConfigInstructions(clientName, projectRoot) {
|
|
221
|
+
const buildPath = join(projectRoot, 'build', 'index.js');
|
|
222
|
+
switch (clientName) {
|
|
223
|
+
case 'claude':
|
|
224
|
+
return `
|
|
225
|
+
Add this to ${getClaudeConfigPath()}:
|
|
226
|
+
|
|
227
|
+
{
|
|
228
|
+
"mcpServers": {
|
|
229
|
+
"ebay-mcp-server": {
|
|
230
|
+
"command": "node",
|
|
231
|
+
"args": ["${buildPath}"]
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}`;
|
|
235
|
+
case 'cline':
|
|
236
|
+
return `
|
|
237
|
+
Add this to ${getClineConfigPath()}:
|
|
238
|
+
|
|
239
|
+
{
|
|
240
|
+
"mcpServers": {
|
|
241
|
+
"ebay-mcp-server": {
|
|
242
|
+
"command": "node",
|
|
243
|
+
"args": ["${buildPath}"]
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}`;
|
|
247
|
+
case 'continue':
|
|
248
|
+
return `
|
|
249
|
+
Add this to ${getContinueConfigPath()}:
|
|
250
|
+
|
|
251
|
+
{
|
|
252
|
+
"experimental": {
|
|
253
|
+
"modelContextProtocolServers": [
|
|
254
|
+
{
|
|
255
|
+
"command": "node",
|
|
256
|
+
"args": ["${buildPath}"]
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
}`;
|
|
261
|
+
default:
|
|
262
|
+
return 'Manual configuration instructions not available for this client.';
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Verify client configuration is correct
|
|
267
|
+
*/
|
|
268
|
+
export function verifyClientConfiguration(clientName, projectRoot) {
|
|
269
|
+
try {
|
|
270
|
+
switch (clientName) {
|
|
271
|
+
case 'claude': {
|
|
272
|
+
const configPath = getClaudeConfigPath();
|
|
273
|
+
if (!existsSync(configPath))
|
|
274
|
+
return false;
|
|
275
|
+
const config = readJSONConfig(configPath);
|
|
276
|
+
const mcpServers = config.mcpServers;
|
|
277
|
+
return !!mcpServers?.['ebay-mcp-server'];
|
|
278
|
+
}
|
|
279
|
+
case 'cline': {
|
|
280
|
+
const configPath = getClineConfigPath();
|
|
281
|
+
if (!existsSync(configPath))
|
|
282
|
+
return false;
|
|
283
|
+
const config = readJSONConfig(configPath);
|
|
284
|
+
const mcpServers = config.mcpServers;
|
|
285
|
+
return !!mcpServers?.['ebay-mcp-server'];
|
|
286
|
+
}
|
|
287
|
+
case 'continue': {
|
|
288
|
+
const configPath = getContinueConfigPath();
|
|
289
|
+
if (!existsSync(configPath))
|
|
290
|
+
return false;
|
|
291
|
+
const config = readJSONConfig(configPath);
|
|
292
|
+
const experimental = config.experimental;
|
|
293
|
+
const mcpServers = experimental?.modelContextProtocolServers;
|
|
294
|
+
return !!mcpServers?.some((server) => server.args?.[0]?.includes('ebay-mcp-server'));
|
|
295
|
+
}
|
|
296
|
+
default:
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get all LLM clients (detected and undetected)
|
|
306
|
+
*/
|
|
307
|
+
export function getAllSupportedClients() {
|
|
308
|
+
return ['claude', 'cline', 'continue'];
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Check if client supports MCP protocol
|
|
312
|
+
*/
|
|
313
|
+
export function supportsNativeMCP(clientName) {
|
|
314
|
+
// Currently, MCP is supported by Anthropic's Claude Desktop and compatible clients
|
|
315
|
+
// Gemini and ChatGPT do not have native MCP support as of now
|
|
316
|
+
const supportedClients = ['claude', 'cline', 'continue'];
|
|
317
|
+
return supportedClients.includes(clientName.toLowerCase());
|
|
318
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Helper - Assists with eBay OAuth token acquisition
|
|
3
|
+
*/
|
|
4
|
+
import { type Server } from 'http';
|
|
5
|
+
import type { EbayConfig } from '../types/ebay.js';
|
|
6
|
+
export interface OAuthCallbackResult {
|
|
7
|
+
code?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
errorDescription?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Generate eBay OAuth authorization URL
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateAuthUrl(clientId: string, redirectUri: string, environment: 'sandbox' | 'production', scopes?: string[]): string;
|
|
15
|
+
/**
|
|
16
|
+
* Start a local server to capture OAuth callback
|
|
17
|
+
*/
|
|
18
|
+
export declare function startCallbackServer(port?: number, timeout?: number): Promise<{
|
|
19
|
+
server: Server;
|
|
20
|
+
codePromise: Promise<OAuthCallbackResult>;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* Interactive OAuth flow with local callback server
|
|
24
|
+
*/
|
|
25
|
+
export declare function interactiveOAuthFlow(config: EbayConfig, scopes?: string[]): Promise<string | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Display manual OAuth instructions
|
|
28
|
+
*/
|
|
29
|
+
export declare function displayManualOAuthInstructions(clientId: string, redirectUri: string, environment: 'sandbox' | 'production', scopes?: string[]): void;
|
|
30
|
+
/**
|
|
31
|
+
* Get help text for RuName (Redirect URI)
|
|
32
|
+
*/
|
|
33
|
+
export declare function getRuNameHelp(): string;
|
|
34
|
+
/**
|
|
35
|
+
* Display first-time developer guide
|
|
36
|
+
*/
|
|
37
|
+
export declare function displayFirstTimeDeveloperGuide(): void;
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Helper - Assists with eBay OAuth token acquisition
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { createServer } from 'http';
|
|
6
|
+
import { getOAuthAuthorizationUrl } from '../config/environment.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate terminal hyperlink (if supported)
|
|
9
|
+
*/
|
|
10
|
+
function hyperlink(text, url) {
|
|
11
|
+
return `\u001B]8;;${url}\u0007${text}\u001B]8;;\u0007`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate eBay OAuth authorization URL
|
|
15
|
+
*/
|
|
16
|
+
export function generateAuthUrl(clientId, redirectUri, environment, scopes) {
|
|
17
|
+
return getOAuthAuthorizationUrl(clientId, redirectUri, environment, scopes);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Start a local server to capture OAuth callback
|
|
21
|
+
*/
|
|
22
|
+
export async function startCallbackServer(port = 3000, timeout = 300000 // 5 minutes
|
|
23
|
+
) {
|
|
24
|
+
return await new Promise((resolve) => {
|
|
25
|
+
let callbackResolver;
|
|
26
|
+
const codePromise = new Promise((res) => {
|
|
27
|
+
callbackResolver = res;
|
|
28
|
+
});
|
|
29
|
+
const server = createServer((req, res) => {
|
|
30
|
+
if (!req.url) {
|
|
31
|
+
res.writeHead(400);
|
|
32
|
+
res.end('Bad Request');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const url = new URL(req.url, `http://localhost:${port}`);
|
|
36
|
+
// Handle OAuth callback
|
|
37
|
+
if (url.pathname === '/oauth/callback') {
|
|
38
|
+
const code = url.searchParams.get('code');
|
|
39
|
+
const error = url.searchParams.get('error');
|
|
40
|
+
const errorDescription = url.searchParams.get('error_description');
|
|
41
|
+
if (code) {
|
|
42
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
43
|
+
res.end(`
|
|
44
|
+
<!DOCTYPE html>
|
|
45
|
+
<html>
|
|
46
|
+
<head>
|
|
47
|
+
<title>eBay MCP - Authorization Successful</title>
|
|
48
|
+
<style>
|
|
49
|
+
body {
|
|
50
|
+
font-family: Arial, sans-serif;
|
|
51
|
+
display: flex;
|
|
52
|
+
justify-content: center;
|
|
53
|
+
align-items: center;
|
|
54
|
+
height: 100vh;
|
|
55
|
+
margin: 0;
|
|
56
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
57
|
+
}
|
|
58
|
+
.container {
|
|
59
|
+
background: white;
|
|
60
|
+
padding: 40px;
|
|
61
|
+
border-radius: 10px;
|
|
62
|
+
box-shadow: 0 10px 40px rgba(0,0,0,0.2);
|
|
63
|
+
text-align: center;
|
|
64
|
+
max-width: 500px;
|
|
65
|
+
}
|
|
66
|
+
.success-icon {
|
|
67
|
+
font-size: 64px;
|
|
68
|
+
margin-bottom: 20px;
|
|
69
|
+
}
|
|
70
|
+
h1 {
|
|
71
|
+
color: #4CAF50;
|
|
72
|
+
margin-bottom: 10px;
|
|
73
|
+
}
|
|
74
|
+
p {
|
|
75
|
+
color: #666;
|
|
76
|
+
line-height: 1.6;
|
|
77
|
+
}
|
|
78
|
+
.code {
|
|
79
|
+
background: #f5f5f5;
|
|
80
|
+
padding: 10px;
|
|
81
|
+
border-radius: 5px;
|
|
82
|
+
font-family: monospace;
|
|
83
|
+
word-break: break-all;
|
|
84
|
+
margin: 20px 0;
|
|
85
|
+
}
|
|
86
|
+
</style>
|
|
87
|
+
</head>
|
|
88
|
+
<body>
|
|
89
|
+
<div class="container">
|
|
90
|
+
<div class="success-icon">ā
</div>
|
|
91
|
+
<h1>Authorization Successful!</h1>
|
|
92
|
+
<p>You have successfully authorized the eBay MCP server.</p>
|
|
93
|
+
<p>You can close this window and return to your terminal.</p>
|
|
94
|
+
<p class="code">Authorization code received</p>
|
|
95
|
+
</div>
|
|
96
|
+
</body>
|
|
97
|
+
</html>
|
|
98
|
+
`);
|
|
99
|
+
callbackResolver({ code });
|
|
100
|
+
}
|
|
101
|
+
else if (error) {
|
|
102
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
103
|
+
res.end(`
|
|
104
|
+
<!DOCTYPE html>
|
|
105
|
+
<html>
|
|
106
|
+
<head>
|
|
107
|
+
<title>eBay MCP - Authorization Failed</title>
|
|
108
|
+
<style>
|
|
109
|
+
body {
|
|
110
|
+
font-family: Arial, sans-serif;
|
|
111
|
+
display: flex;
|
|
112
|
+
justify-content: center;
|
|
113
|
+
align-items: center;
|
|
114
|
+
height: 100vh;
|
|
115
|
+
margin: 0;
|
|
116
|
+
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
|
|
117
|
+
}
|
|
118
|
+
.container {
|
|
119
|
+
background: white;
|
|
120
|
+
padding: 40px;
|
|
121
|
+
border-radius: 10px;
|
|
122
|
+
box-shadow: 0 10px 40px rgba(0,0,0,0.2);
|
|
123
|
+
text-align: center;
|
|
124
|
+
max-width: 500px;
|
|
125
|
+
}
|
|
126
|
+
.error-icon {
|
|
127
|
+
font-size: 64px;
|
|
128
|
+
margin-bottom: 20px;
|
|
129
|
+
}
|
|
130
|
+
h1 {
|
|
131
|
+
color: #f44336;
|
|
132
|
+
margin-bottom: 10px; /* Fix: Changed color to red for error */
|
|
133
|
+
}
|
|
134
|
+
p {
|
|
135
|
+
color: #666;
|
|
136
|
+
line-height: 1.6;
|
|
137
|
+
}
|
|
138
|
+
.error {
|
|
139
|
+
background: #ffebee;
|
|
140
|
+
color: #c62828;
|
|
141
|
+
padding: 10px;
|
|
142
|
+
border-radius: 5px;
|
|
143
|
+
margin: 20px 0;
|
|
144
|
+
}
|
|
145
|
+
</style>
|
|
146
|
+
</head>
|
|
147
|
+
<body>
|
|
148
|
+
<div class="container">
|
|
149
|
+
<div class="error-icon">ā</div>
|
|
150
|
+
<h1>Authorization Failed</h1>
|
|
151
|
+
<p>There was an error during authorization.</p>
|
|
152
|
+
<div class="error">${errorDescription ?? error}</div>
|
|
153
|
+
<p>Please return to your terminal and try again.</p>
|
|
154
|
+
</div>
|
|
155
|
+
<script>
|
|
156
|
+
// Close the window after a short delay
|
|
157
|
+
setTimeout(() => window.close(), 5000);
|
|
158
|
+
</script>
|
|
159
|
+
</body>
|
|
160
|
+
</html>
|
|
161
|
+
`);
|
|
162
|
+
callbackResolver({ error, errorDescription: errorDescription ?? undefined });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
res.writeHead(404);
|
|
167
|
+
res.end('Not Found');
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
server.listen(port, () => {
|
|
171
|
+
console.log(chalk.gray(` OAuth callback server listening on http://localhost:${port}`));
|
|
172
|
+
resolve({ server, codePromise });
|
|
173
|
+
});
|
|
174
|
+
// Set timeout
|
|
175
|
+
setTimeout(() => {
|
|
176
|
+
callbackResolver({
|
|
177
|
+
error: 'timeout',
|
|
178
|
+
errorDescription: 'OAuth callback timeout - no response received',
|
|
179
|
+
});
|
|
180
|
+
}, timeout);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Interactive OAuth flow with local callback server
|
|
185
|
+
*/
|
|
186
|
+
export async function interactiveOAuthFlow(config, scopes) {
|
|
187
|
+
console.log(chalk.bold.cyan('\nš Interactive OAuth Flow\n'));
|
|
188
|
+
// Check if redirect URI is localhost
|
|
189
|
+
const redirectUri = config.redirectUri || 'http://localhost:3000/oauth/callback';
|
|
190
|
+
const isLocalhost = redirectUri.includes('localhost') || redirectUri.includes('127.0.0.1');
|
|
191
|
+
if (!isLocalhost) {
|
|
192
|
+
console.log(chalk.yellow('ā ļø Your redirect URI is not localhost. Interactive flow requires localhost callback.\n'));
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
// Extract port from redirect URI
|
|
196
|
+
const portMatch = /:(\d+)/.exec(redirectUri);
|
|
197
|
+
const port = portMatch ? parseInt(portMatch[1], 10) : 3000;
|
|
198
|
+
// Start callback server
|
|
199
|
+
console.log(chalk.cyan('Starting local OAuth callback server...\n'));
|
|
200
|
+
const { server, codePromise } = await startCallbackServer(port);
|
|
201
|
+
// Generate auth URL
|
|
202
|
+
const authUrl = generateAuthUrl(config.clientId, redirectUri, config.environment, scopes);
|
|
203
|
+
console.log(chalk.bold.white('š Step 1: Authorize the Application\n'));
|
|
204
|
+
console.log(chalk.gray('Open this URL in your browser:\n'));
|
|
205
|
+
console.log(chalk.blue.underline(hyperlink(authUrl.substring(0, 20) + '...', authUrl)));
|
|
206
|
+
console.log('');
|
|
207
|
+
console.log(chalk.gray('Waiting for authorization...'));
|
|
208
|
+
console.log(chalk.gray('(This window will update automatically after you authorize)\n'));
|
|
209
|
+
// Wait for callback
|
|
210
|
+
const result = await codePromise;
|
|
211
|
+
// Close server
|
|
212
|
+
server.close();
|
|
213
|
+
if (result.error) {
|
|
214
|
+
console.log(chalk.red(`\nā Authorization failed: ${result.errorDescription || result.error}\n`));
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
if (result.code) {
|
|
218
|
+
console.log(chalk.green('\nā Authorization successful!\n'));
|
|
219
|
+
return result.code;
|
|
220
|
+
}
|
|
221
|
+
console.log(chalk.yellow('\nā ļø No authorization code received.\n'));
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Display manual OAuth instructions
|
|
226
|
+
*/
|
|
227
|
+
export function displayManualOAuthInstructions(clientId, redirectUri, environment, scopes) {
|
|
228
|
+
const authUrl = generateAuthUrl(clientId, redirectUri, environment, scopes);
|
|
229
|
+
console.log(chalk.bold.cyan('\nš Manual OAuth Token Acquisition Guide\n'));
|
|
230
|
+
console.log(chalk.white('Step 1: Generate Authorization URL\n'));
|
|
231
|
+
console.log(chalk.gray('Copy this URL and open it in your browser:\n'));
|
|
232
|
+
console.log(chalk.blue.underline(authUrl));
|
|
233
|
+
console.log('');
|
|
234
|
+
console.log(chalk.white('\nStep 2: Authorize the Application\n'));
|
|
235
|
+
console.log(chalk.gray(' ⢠Log in to your eBay account'));
|
|
236
|
+
console.log(chalk.gray(' ⢠Review the permissions requested'));
|
|
237
|
+
console.log(chalk.gray(' ⢠Click "Agree" to authorize\n'));
|
|
238
|
+
console.log(chalk.white('Step 3: Get the Authorization Code\n'));
|
|
239
|
+
console.log(chalk.gray(' ⢠After authorization, you will be redirected to your redirect URI'));
|
|
240
|
+
console.log(chalk.gray(' ⢠The URL will contain a "code" parameter'));
|
|
241
|
+
console.log(chalk.gray(' ⢠Example: https://your-redirect-uri?code=v^1.1#i^1...\n'));
|
|
242
|
+
console.log(chalk.white('Step 4: Exchange Code for Tokens\n'));
|
|
243
|
+
console.log(chalk.gray(' ⢠Use the code to get your refresh token'));
|
|
244
|
+
console.log(chalk.gray(' ⢠This can be done through the MCP tool: ebay_exchange_auth_code'));
|
|
245
|
+
console.log(chalk.gray(' ⢠Or paste the code in the setup wizard when prompted\n'));
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get help text for RuName (Redirect URI)
|
|
249
|
+
*/
|
|
250
|
+
export function getRuNameHelp() {
|
|
251
|
+
return `
|
|
252
|
+
${chalk.bold.cyan('What is a RuName (Redirect URI)?')}
|
|
253
|
+
|
|
254
|
+
A RuName (Redirect URL name) is a unique identifier for your OAuth redirect URI.
|
|
255
|
+
It's required for eBay's OAuth flow to know where to send users after authorization.
|
|
256
|
+
|
|
257
|
+
${chalk.bold.white('How to create a RuName:')}
|
|
258
|
+
|
|
259
|
+
1. Go to eBay Developer Portal:
|
|
260
|
+
${chalk.blue.underline('https://developer.ebay.com/my/keys')}
|
|
261
|
+
|
|
262
|
+
2. Select your application
|
|
263
|
+
|
|
264
|
+
3. Navigate to "User Tokens" section
|
|
265
|
+
|
|
266
|
+
4. Click "Add RuName"
|
|
267
|
+
|
|
268
|
+
5. Enter your redirect URI:
|
|
269
|
+
${chalk.gray('For local development: http://localhost:3000/oauth/callback')}
|
|
270
|
+
${chalk.gray('For production: https://your-domain.com/oauth/callback')}
|
|
271
|
+
|
|
272
|
+
6. Copy the generated RuName and use it in your configuration
|
|
273
|
+
|
|
274
|
+
${chalk.bold.white('Common RuName formats:')}
|
|
275
|
+
|
|
276
|
+
${chalk.gray('⢠For localhost:')} YourCompany-YourApp-LocalTest-RuName
|
|
277
|
+
${chalk.gray('⢠For production:')} YourCompany-YourApp-Production-RuName
|
|
278
|
+
|
|
279
|
+
${chalk.yellow('Note:')} The RuName is NOT the same as the redirect URI itself.
|
|
280
|
+
It's a reference name that eBay associates with your redirect URI.
|
|
281
|
+
`;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Display first-time developer guide
|
|
285
|
+
*/
|
|
286
|
+
export function displayFirstTimeDeveloperGuide() {
|
|
287
|
+
console.log(chalk.bold.cyan('\nš First-Time eBay Developer Guide\n'));
|
|
288
|
+
console.log(chalk.white('Welcome! Here\'s how to get started:\n'));
|
|
289
|
+
console.log(chalk.bold.yellow('Step 1: Create eBay Developer Account\n'));
|
|
290
|
+
console.log(chalk.gray(' 1. Visit: ') + chalk.blue.underline('https://developer.ebay.com/'));
|
|
291
|
+
console.log(chalk.gray(' 2. Click "Register" or "Join"'));
|
|
292
|
+
console.log(chalk.gray(' 3. Complete the registration form'));
|
|
293
|
+
console.log(chalk.gray(' 4. Verify your email address\n'));
|
|
294
|
+
console.log(chalk.bold.yellow('Step 2: Create an Application\n'));
|
|
295
|
+
console.log(chalk.gray(' 1. Go to: ') + chalk.blue.underline('https://developer.ebay.com/my/keys'));
|
|
296
|
+
console.log(chalk.gray(' 2. Click "Create Application"'));
|
|
297
|
+
console.log(chalk.gray(' 3. Fill in application details (name, description)'));
|
|
298
|
+
console.log(chalk.gray(' 4. Choose Sandbox environment to start\n'));
|
|
299
|
+
console.log(chalk.bold.yellow('Step 3: Get Your Credentials\n'));
|
|
300
|
+
console.log(chalk.gray(' After creating the app, you will see:'));
|
|
301
|
+
console.log(chalk.gray(' ⢠App ID (Client ID) - Copy this'));
|
|
302
|
+
console.log(chalk.gray(' ⢠Cert ID (Client Secret) - Copy this'));
|
|
303
|
+
console.log(chalk.gray(' ⢠These are needed for the setup wizard\n'));
|
|
304
|
+
console.log(chalk.bold.yellow('Step 4: Create RuName (Redirect URI)\n'));
|
|
305
|
+
console.log(chalk.gray(' 1. In your application settings'));
|
|
306
|
+
console.log(chalk.gray(' 2. Navigate to "User Tokens" section'));
|
|
307
|
+
console.log(chalk.gray(' 3. Click "Add RuName"'));
|
|
308
|
+
console.log(chalk.gray(' 4. Enter: http://localhost:3000/oauth/callback'));
|
|
309
|
+
console.log(chalk.gray(' 5. Save and copy the generated RuName\n'));
|
|
310
|
+
console.log(chalk.bold.yellow('Step 5: Get User Token\n'));
|
|
311
|
+
console.log(chalk.gray(' Option A: Use this setup wizard (recommended)'));
|
|
312
|
+
console.log(chalk.gray(' Option B: Manual OAuth flow through eBay Developer Portal\n'));
|
|
313
|
+
console.log(chalk.green.bold('ā
Once you have these, you\'re ready to continue!\n'));
|
|
314
|
+
console.log(chalk.gray('Press Enter to continue when you have your credentials ready...'));
|
|
315
|
+
}
|