Files
NoteNextra-origin/test/test-mcp-server.mjs
2026-03-19 23:46:00 -05:00

75 lines
2.1 KiB
JavaScript

import assert from 'node:assert/strict'
import path from 'node:path'
import process from 'node:process'
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'
const transport = new StdioClientTransport({
command: process.execPath,
args: [path.join(process.cwd(), 'mcp-server.mjs')],
cwd: process.cwd(),
stderr: 'pipe'
})
let stderrOutput = ''
transport.stderr?.setEncoding('utf8')
transport.stderr?.on('data', (chunk) => {
stderrOutput += chunk
})
const client = new Client({
name: 'notenextra-mcp-test',
version: '1.0.0'
})
async function main() {
await client.connect(transport)
const toolListResponse = await client.listTools()
const toolNames = toolListResponse.tools.map((tool) => tool.name).sort()
assert.deepEqual(toolNames, ['list_notes', 'read_note', 'search_notes'])
const listNotesResponse = await client.callTool({
name: 'list_notes',
arguments: {
course: 'CSE442T'
}
})
const listedNotes = listNotesResponse.content[0].text
assert.match(listedNotes, /CSE442T\/CSE442T_L1/, 'list_notes should include CSE442T lecture notes')
const readNoteResponse = await client.callTool({
name: 'read_note',
arguments: {
noteId: 'about'
}
})
const aboutText = readNoteResponse.content[0].text
assert.match(aboutText, /# about/i)
assert.match(aboutText, /This is a static server for me to share my notes/i)
const searchResponse = await client.callTool({
name: 'search_notes',
arguments: {
query: "Kerckhoffs' principle",
limit: 3
}
})
const searchText = searchResponse.content[0].text
assert.match(searchText, /CSE442T\/CSE442T_L1/, 'search_notes should find the cryptography lecture')
assert.match(searchText, /Kerckhoffs/i)
}
try {
await main()
process.stdout.write('MCP server test passed.\n')
} catch (error) {
const suffix = stderrOutput ? `\nServer stderr:\n${stderrOutput}` : ''
process.stderr.write(`${error.stack || error}${suffix}\n`)
process.exitCode = 1
} finally {
await client.close().catch(() => {})
await transport.close().catch(() => {})
}