BirdNet-Pi MCP Server
by DMontgomery40
Verified
- scripts
#!/usr/bin/env node
import fs from 'fs/promises';
import path from 'path';
import { fileURLToPath } from 'url';
import { createInterface } from 'readline';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const rl = createInterface({
input: process.stdin,
output: process.stdout
});
const question = (query) => new Promise((resolve) => rl.question(query, resolve));
async function setup() {
console.log('BirdNet-Pi MCP Server Setup\n');
// Get BirdNet-Pi paths
const dataPath = await question('Enter BirdNet-Pi data directory path [/var/www/birdnet/data]: ')
|| '/var/www/birdnet/data';
const audioPath = await question('Enter BirdNet-Pi audio directory path [/var/www/birdnet/audio]: ')
|| '/var/www/birdnet/audio';
// Create .env file
const envContent = `BIRDNET_DATA_PATH=${dataPath}
BIRDNET_AUDIO_PATH=${audioPath}
BIRDNET_DETECTION_FILE=detections.json`;
try {
await fs.writeFile(path.join(__dirname, '..', '.env'), envContent);
console.log('\nConfiguration saved to .env file');
// Verify paths exist
await fs.access(dataPath);
await fs.access(audioPath);
console.log('Verified access to BirdNet-Pi directories');
// Create example client config
const clientConfig = {
mcpServers: {
birdnet: {
command: 'npm',
args: ['start'],
cwd: process.cwd(),
env: {
BIRDNET_DATA_PATH: dataPath,
BIRDNET_AUDIO_PATH: audioPath
}
}
}
};
await fs.writeFile(
path.join(__dirname, '..', 'client-config-example.json'),
JSON.stringify(clientConfig, null, 2)
);
console.log('Created example client configuration file');
console.log('\nSetup completed successfully!');
} catch (error) {
console.error('\nError during setup:', error.message);
console.error('Please check the paths and permissions and try again');
} finally {
rl.close();
}
}
setup();