import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { VergeApiClient } from '../../../src/client/api.js';
import { AuthManager } from '../../../src/auth/index.js';
import { createPlumeServer } from '../../../src/server.js';
/**
* 統合テスト用のテストハーネス
* MCPクライアント/サーバーをInMemoryTransportで接続し、統合テストを可能にする
*/
export interface TestHarness {
client: Client;
server: Server;
apiClient: VergeApiClient;
authManager?: AuthManager;
close: () => Promise<void>;
}
export interface TestHarnessOptions {
apiUrl?: string;
authManager?: AuthManager;
}
/**
* テストハーネスを作成
* @param options オプション設定(apiUrl, authManager)
* @returns テストハーネス
*/
export async function createTestHarness(
options: TestHarnessOptions | string = {}
): Promise<TestHarness> {
// 後方互換性: 文字列が渡された場合はapiUrlとして扱う
const opts: TestHarnessOptions = typeof options === 'string' ? { apiUrl: options } : options;
const apiUrl = opts.apiUrl ?? 'https://test.plume-api.example.com';
const authManager = opts.authManager;
// APIクライアントを作成
const apiClient = new VergeApiClient(apiUrl);
// MCPサーバーを作成(AuthManagerがある場合は渡す)
const server = createPlumeServer(apiClient, authManager);
// InMemoryTransportでクライアント/サーバーを接続
const [clientTransport, serverTransport] =
InMemoryTransport.createLinkedPair();
// サーバーを接続
await server.connect(serverTransport);
// クライアントを作成・接続
const client = new Client(
{
name: 'test-client',
version: '1.0.0',
},
{
capabilities: {},
}
);
await client.connect(clientTransport);
// クリーンアップ関数
const close = async () => {
await client.close();
await server.close();
};
return {
client,
server,
apiClient,
authManager,
close,
};
}