mcp-wayback-machine
Version:
MCP server and CLI tool for interacting with the Wayback Machine without API keys
136 lines • 5.6 kB
JavaScript
import { Command } from 'commander';
import chalk from 'chalk';
import ora from 'ora';
import { saveUrl } from './tools/save.js';
import { getArchivedUrl } from './tools/retrieve.js';
import { searchArchives } from './tools/search.js';
import { checkArchiveStatus } from './tools/status.js';
export function createCLI() {
const program = new Command();
program
.name('wayback')
.description('CLI tool for interacting with the Wayback Machine')
.version('1.0.0');
// Save URL command
program
.command('save <url>')
.description('Save a URL to the Wayback Machine')
.action(async (url) => {
const spinner = ora('Saving URL to Wayback Machine...').start();
try {
const result = await saveUrl({ url });
if (result.success) {
spinner.succeed(chalk.green('URL saved successfully!'));
console.log(chalk.blue('Archive URL:'), result.archivedUrl);
if (result.timestamp) {
console.log(chalk.blue('Timestamp:'), result.timestamp);
}
if (result.jobId) {
console.log(chalk.blue('Job ID:'), result.jobId);
}
}
else {
spinner.fail(chalk.red(result.message));
}
}
catch (error) {
spinner.fail(chalk.red('Error saving URL'));
console.error(error);
}
});
// Get archived URL command
program
.command('get <url>')
.description('Get the archived version of a URL')
.option('-t, --timestamp <timestamp>', 'Specific timestamp (YYYYMMDDHHMMSS) or "latest"')
.action(async (url, options) => {
const spinner = ora('Retrieving archived URL...').start();
try {
const result = await getArchivedUrl({ url, timestamp: options.timestamp });
if (result.success && result.available) {
spinner.succeed(chalk.green('Archive found!'));
console.log(chalk.blue('Archived URL:'), result.archivedUrl);
console.log(chalk.blue('Timestamp:'), result.timestamp);
}
else {
spinner.fail(chalk.yellow(result.message || 'No archive found'));
}
}
catch (error) {
spinner.fail(chalk.red('Error retrieving archive'));
console.error(error);
}
});
// Search archives command
program
.command('search <url>')
.description('Search for all archived versions of a URL')
.option('-f, --from <date>', 'Start date (YYYY-MM-DD)')
.option('-t, --to <date>', 'End date (YYYY-MM-DD)')
.option('-l, --limit <number>', 'Maximum number of results', '10')
.action(async (url, options) => {
const spinner = ora('Searching archives...').start();
try {
const result = await searchArchives({
url,
from: options.from,
to: options.to,
limit: parseInt(options.limit, 10),
});
if (result.success && result.results && result.results.length > 0) {
spinner.succeed(chalk.green(`Found ${result.totalResults} archives`));
console.log('\n' + chalk.bold('Archive snapshots:'));
result.results.forEach((snapshot) => {
console.log(chalk.gray('─'.repeat(60)));
console.log(chalk.blue('Date:'), snapshot.date);
console.log(chalk.blue('URL:'), snapshot.archivedUrl);
console.log(chalk.blue('Status:'), snapshot.statusCode);
console.log(chalk.blue('Type:'), snapshot.mimeType);
});
}
else {
spinner.fail(chalk.yellow(result.message || 'No archives found'));
}
}
catch (error) {
spinner.fail(chalk.red('Error searching archives'));
console.error(error);
}
});
// Check status command
program
.command('status <url>')
.description('Check the archive status of a URL')
.action(async (url) => {
const spinner = ora('Checking archive status...').start();
try {
const result = await checkArchiveStatus({ url });
if (result.success) {
if (result.isArchived) {
spinner.succeed(chalk.green('URL is archived!'));
console.log(chalk.blue('Total captures:'), result.totalCaptures);
console.log(chalk.blue('First capture:'), result.firstCapture);
console.log(chalk.blue('Last capture:'), result.lastCapture);
if (result.yearlyCaptures) {
console.log('\n' + chalk.bold('Yearly captures:'));
Object.entries(result.yearlyCaptures).forEach(([year, count]) => {
console.log(chalk.blue(year + ':'), count);
});
}
}
else {
spinner.warn(chalk.yellow('URL has not been archived'));
}
}
else {
spinner.fail(chalk.red(result.message || 'Error checking status'));
}
}
catch (error) {
spinner.fail(chalk.red('Error checking status'));
console.error(error);
}
});
return program;
}
//# sourceMappingURL=cli.js.map