summaryrefslogtreecommitdiff
path: root/integration-tests/simple-mcp-server.test.js
diff options
context:
space:
mode:
authorJacob Richman <[email protected]>2025-08-12 09:19:09 -0700
committerGitHub <[email protected]>2025-08-12 16:19:09 +0000
commit804c181ac4a3dc1c4971a5b8a643421bbe697f3d (patch)
treedc0ae93448453081954da307a91d90dfec9c361a /integration-tests/simple-mcp-server.test.js
parent2d1a6af890da1e9437cd1a1774e2c7fc7ad32957 (diff)
chore(integration-tests): refactor to typescript (#5645)
Diffstat (limited to 'integration-tests/simple-mcp-server.test.js')
-rw-r--r--integration-tests/simple-mcp-server.test.js211
1 files changed, 0 insertions, 211 deletions
diff --git a/integration-tests/simple-mcp-server.test.js b/integration-tests/simple-mcp-server.test.js
deleted file mode 100644
index 987f69d2..00000000
--- a/integration-tests/simple-mcp-server.test.js
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * @license
- * Copyright 2025 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * This test verifies MCP (Model Context Protocol) server integration.
- * It uses a minimal MCP server implementation that doesn't require
- * external dependencies, making it compatible with Docker sandbox mode.
- */
-
-import { test, describe, before } from 'node:test';
-import { strict as assert } from 'node:assert';
-import { TestRig, validateModelOutput } from './test-helper.js';
-import { join } from 'path';
-import { fileURLToPath } from 'url';
-import { writeFileSync } from 'fs';
-
-const __dirname = fileURLToPath(new URL('.', import.meta.url));
-
-// Create a minimal MCP server that doesn't require external dependencies
-// This implements the MCP protocol directly using Node.js built-ins
-const serverScript = `#!/usr/bin/env node
-/**
- * @license
- * Copyright 2025 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const readline = require('readline');
-const fs = require('fs');
-
-// Debug logging to stderr (only when MCP_DEBUG or VERBOSE is set)
-const debugEnabled = process.env.MCP_DEBUG === 'true' || process.env.VERBOSE === 'true';
-function debug(msg) {
- if (debugEnabled) {
- fs.writeSync(2, \`[MCP-DEBUG] \${msg}\\n\`);
- }
-}
-
-debug('MCP server starting...');
-
-// Simple JSON-RPC implementation for MCP
-class SimpleJSONRPC {
- constructor() {
- this.handlers = new Map();
- this.rl = readline.createInterface({
- input: process.stdin,
- output: process.stdout,
- terminal: false
- });
-
- this.rl.on('line', (line) => {
- debug(\`Received line: \${line}\`);
- try {
- const message = JSON.parse(line);
- debug(\`Parsed message: \${JSON.stringify(message)}\`);
- this.handleMessage(message);
- } catch (e) {
- debug(\`Parse error: \${e.message}\`);
- }
- });
- }
-
- send(message) {
- const msgStr = JSON.stringify(message);
- debug(\`Sending message: \${msgStr}\`);
- process.stdout.write(msgStr + '\\n');
- }
-
- async handleMessage(message) {
- if (message.method && this.handlers.has(message.method)) {
- try {
- const result = await this.handlers.get(message.method)(message.params || {});
- if (message.id !== undefined) {
- this.send({
- jsonrpc: '2.0',
- id: message.id,
- result
- });
- }
- } catch (error) {
- if (message.id !== undefined) {
- this.send({
- jsonrpc: '2.0',
- id: message.id,
- error: {
- code: -32603,
- message: error.message
- }
- });
- }
- }
- } else if (message.id !== undefined) {
- this.send({
- jsonrpc: '2.0',
- id: message.id,
- error: {
- code: -32601,
- message: 'Method not found'
- }
- });
- }
- }
-
- on(method, handler) {
- this.handlers.set(method, handler);
- }
-}
-
-// Create MCP server
-const rpc = new SimpleJSONRPC();
-
-// Handle initialize
-rpc.on('initialize', async (params) => {
- debug('Handling initialize request');
- return {
- protocolVersion: '2024-11-05',
- capabilities: {
- tools: {}
- },
- serverInfo: {
- name: 'addition-server',
- version: '1.0.0'
- }
- };
-});
-
-// Handle tools/list
-rpc.on('tools/list', async () => {
- debug('Handling tools/list request');
- return {
- tools: [{
- name: 'add',
- description: 'Add two numbers',
- inputSchema: {
- type: 'object',
- properties: {
- a: { type: 'number', description: 'First number' },
- b: { type: 'number', description: 'Second number' }
- },
- required: ['a', 'b']
- }
- }]
- };
-});
-
-// Handle tools/call
-rpc.on('tools/call', async (params) => {
- debug(\`Handling tools/call request for tool: \${params.name}\`);
- if (params.name === 'add') {
- const { a, b } = params.arguments;
- return {
- content: [{
- type: 'text',
- text: String(a + b)
- }]
- };
- }
- throw new Error('Unknown tool: ' + params.name);
-});
-
-// Send initialization notification
-rpc.send({
- jsonrpc: '2.0',
- method: 'initialized'
-});
-`;
-
-describe('simple-mcp-server', () => {
- const rig = new TestRig();
-
- before(async () => {
- // Setup test directory with MCP server configuration
- await rig.setup('simple-mcp-server', {
- settings: {
- mcpServers: {
- 'addition-server': {
- command: 'node',
- args: ['mcp-server.cjs'],
- },
- },
- },
- });
-
- // Create server script in the test directory
- const testServerPath = join(rig.testDir, 'mcp-server.cjs');
- writeFileSync(testServerPath, serverScript);
-
- // Make the script executable (though running with 'node' should work anyway)
- if (process.platform !== 'win32') {
- const { chmodSync } = await import('fs');
- chmodSync(testServerPath, 0o755);
- }
- });
-
- test('should add two numbers', async () => {
- // Test directory is already set up in before hook
- // Just run the command - MCP server config is in settings.json
- const output = await rig.run('add 5 and 10');
-
- const foundToolCall = await rig.waitForToolCall('add');
-
- assert.ok(foundToolCall, 'Expected to find an add tool call');
-
- // Validate model output - will throw if no output, fail if missing expected content
- validateModelOutput(output, '15', 'MCP server test');
- assert.ok(output.includes('15'), 'Expected output to contain the sum (15)');
- });
-});