#!/usr/bin/env node
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
async function testMCPServer() {
console.log('๐งช Testing Typefully MCP Server...\n');
const transport = new StdioClientTransport({
command: 'node',
args: ['dist/index.js'],
env: { ...process.env }
});
const client = new Client(
{
name: 'test-client',
version: '1.0.0',
},
{
capabilities: {},
}
);
try {
await client.connect(transport);
console.log('โ
Connected to MCP server');
// Test 1: List available tools
console.log('\n๐ Testing tool listing...');
const toolsResult = await client.listTools();
console.log(`โ
Found ${toolsResult.tools.length} tools:`);
toolsResult.tools.forEach((tool: any) => {
console.log(` - ${tool.name}: ${tool.description}`);
});
// Test 2: Test create_draft tool (with dry run content)
console.log('\n๐ฆ Testing create_draft tool...');
try {
const createResult = await client.callTool({
name: 'create_draft',
arguments: {
content: 'Test tweet from MCP server! ๐ค #testing',
threadify: false,
}
});
console.log('โ
Create draft test passed');
console.log('Response:', createResult.content[0].text);
} catch (error: any) {
if (error.message.includes('API key') || error.message.includes('401') || error.message.includes('403')) {
console.log('โ ๏ธ API key not set or invalid (expected for local testing)');
console.log(' Set TYPEFULLY_API_KEY environment variable to test with real API');
} else {
console.log('โ Create draft test failed:', error.message);
}
}
// Test 3: Test get_scheduled_drafts tool
console.log('\n๐
Testing get_scheduled_drafts tool...');
try {
const scheduledResult = await client.callTool({
name: 'get_scheduled_drafts',
arguments: {}
});
console.log('โ
Get scheduled drafts test passed');
console.log('Response:', scheduledResult.content[0].text);
} catch (error: any) {
if (error.message.includes('API key') || error.message.includes('401') || error.message.includes('403')) {
console.log('โ ๏ธ API key not set or invalid (expected for local testing)');
} else {
console.log('โ Get scheduled drafts test failed:', error.message);
}
}
// Test 4: Test get_published_drafts tool
console.log('\n๐ฐ Testing get_published_drafts tool...');
try {
const publishedResult = await client.callTool({
name: 'get_published_drafts',
arguments: {}
});
console.log('โ
Get published drafts test passed');
console.log('Response:', publishedResult.content[0].text);
} catch (error: any) {
if (error.message.includes('API key') || error.message.includes('401') || error.message.includes('403')) {
console.log('โ ๏ธ API key not set or invalid (expected for local testing)');
} else {
console.log('โ Get published drafts test failed:', error.message);
}
}
console.log('\n๐ Local testing completed!');
console.log('\n๐ก To test with real API:');
console.log(' 1. Get your API key from Typefully Settings > Integrations');
console.log(' 2. Set: export TYPEFULLY_API_KEY="your_key_here"');
console.log(' 3. Run: npm run test');
} catch (error) {
console.error('โ Failed to connect to MCP server:', error);
} finally {
await client.close();
}
}
// Handle process termination
process.on('SIGINT', () => {
console.log('\n๐ Test interrupted');
process.exit(0);
});
testMCPServer().catch(console.error);