Some checks failed
Sync from Gitea (main→main, keep workflow) / mirror (push) Has been cancelled
122 lines
3.4 KiB
JavaScript
122 lines
3.4 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import process from 'node:process'
|
|
|
|
import worker from '../mcp-worker/src/index.mjs'
|
|
import { LATEST_PROTOCOL_VERSION } from '@modelcontextprotocol/sdk/types.js'
|
|
|
|
function makeJsonRequest(url, body, headers = {}) {
|
|
return new Request(url, {
|
|
method: 'POST',
|
|
headers: {
|
|
accept: 'application/json, text/event-stream',
|
|
'content-type': 'application/json',
|
|
...headers
|
|
},
|
|
body: JSON.stringify(body)
|
|
})
|
|
}
|
|
|
|
const baseUrl = 'https://example.com'
|
|
|
|
const healthResponse = await worker.fetch(new Request(`${baseUrl}/health`))
|
|
assert.equal(healthResponse.status, 200)
|
|
const healthJson = await healthResponse.json()
|
|
assert.equal(healthJson.status, 'ok')
|
|
assert.ok(healthJson.notes > 0)
|
|
|
|
const initializeResponse = await worker.fetch(makeJsonRequest(`${baseUrl}/mcp`, {
|
|
jsonrpc: '2.0',
|
|
id: 1,
|
|
method: 'initialize',
|
|
params: {
|
|
protocolVersion: LATEST_PROTOCOL_VERSION,
|
|
capabilities: {},
|
|
clientInfo: {
|
|
name: 'notenextra-worker-test',
|
|
version: '1.0.0'
|
|
}
|
|
}
|
|
}))
|
|
|
|
assert.equal(initializeResponse.status, 200)
|
|
const sessionId = initializeResponse.headers.get('mcp-session-id')
|
|
assert.ok(sessionId, 'initialize should return an MCP session ID')
|
|
const protocolVersion = initializeResponse.headers.get('mcp-protocol-version') || LATEST_PROTOCOL_VERSION
|
|
const initializeJson = await initializeResponse.json()
|
|
assert.ok(initializeJson.result, 'initialize should return a result payload')
|
|
|
|
const toolListResponse = await worker.fetch(makeJsonRequest(`${baseUrl}/mcp`, {
|
|
jsonrpc: '2.0',
|
|
id: 2,
|
|
method: 'tools/list',
|
|
params: {}
|
|
}, {
|
|
'mcp-protocol-version': protocolVersion,
|
|
'mcp-session-id': sessionId
|
|
}))
|
|
|
|
assert.equal(toolListResponse.status, 200)
|
|
const toolListJson = await toolListResponse.json()
|
|
const toolNames = toolListJson.result.tools.map((tool) => tool.name).sort()
|
|
assert.deepEqual(toolNames, ['list_notes', 'read_note', 'search_notes'])
|
|
|
|
const listNotesResponse = await worker.fetch(makeJsonRequest(`${baseUrl}/mcp`, {
|
|
jsonrpc: '2.0',
|
|
id: 3,
|
|
method: 'tools/call',
|
|
params: {
|
|
name: 'list_notes',
|
|
arguments: {
|
|
course: 'CSE442T'
|
|
}
|
|
}
|
|
}, {
|
|
'mcp-protocol-version': protocolVersion,
|
|
'mcp-session-id': sessionId
|
|
}))
|
|
|
|
assert.equal(listNotesResponse.status, 200)
|
|
const listNotesJson = await listNotesResponse.json()
|
|
assert.match(listNotesJson.result.content[0].text, /CSE442T\/CSE442T_L1/)
|
|
|
|
const readNoteResponse = await worker.fetch(makeJsonRequest(`${baseUrl}/mcp`, {
|
|
jsonrpc: '2.0',
|
|
id: 4,
|
|
method: 'tools/call',
|
|
params: {
|
|
name: 'read_note',
|
|
arguments: {
|
|
noteId: 'about'
|
|
}
|
|
}
|
|
}, {
|
|
'mcp-protocol-version': protocolVersion,
|
|
'mcp-session-id': sessionId
|
|
}))
|
|
|
|
assert.equal(readNoteResponse.status, 200)
|
|
const readNoteJson = await readNoteResponse.json()
|
|
assert.match(readNoteJson.result.content[0].text, /This is a static server for me to share my notes/i)
|
|
|
|
const searchResponse = await worker.fetch(makeJsonRequest(`${baseUrl}/mcp`, {
|
|
jsonrpc: '2.0',
|
|
id: 5,
|
|
method: 'tools/call',
|
|
params: {
|
|
name: 'search_notes',
|
|
arguments: {
|
|
query: "Kerckhoffs' principle",
|
|
limit: 3
|
|
}
|
|
}
|
|
}, {
|
|
'mcp-protocol-version': protocolVersion,
|
|
'mcp-session-id': sessionId
|
|
}))
|
|
|
|
assert.equal(searchResponse.status, 200)
|
|
const searchJson = await searchResponse.json()
|
|
assert.match(searchJson.result.content[0].text, /CSE442T\/CSE442T_L1/)
|
|
|
|
process.stdout.write('MCP worker test passed.\n')
|