move CLI script to dedicated scripts directory (#1073)
This commit is contained in:
parent
ee9fed28cc
commit
9757ace06e
3 changed files with 14 additions and 14 deletions
8
package-lock.json
generated
8
package-lock.json
generated
|
|
@ -3535,9 +3535,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/express-rate-limit": {
|
||||
"version": "7.5.0",
|
||||
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz",
|
||||
"integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==",
|
||||
"version": "7.5.1",
|
||||
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz",
|
||||
"integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 16"
|
||||
|
|
@ -3546,7 +3546,7 @@
|
|||
"url": "https://github.com/sponsors/express-rate-limit"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"express": "^4.11 || 5 || ^5.0.0-beta.1"
|
||||
"express": ">= 4.11"
|
||||
}
|
||||
},
|
||||
"node_modules/express/node_modules/debug": {
|
||||
|
|
|
|||
|
|
@ -71,8 +71,8 @@
|
|||
"lint:fix": "eslint src/ --fix && prettier --write .",
|
||||
"test": "npm run fetch:spec-types && jest",
|
||||
"start": "npm run server",
|
||||
"server": "tsx watch --clear-screen=false src/cli.ts server",
|
||||
"client": "tsx src/cli.ts client"
|
||||
"server": "tsx watch --clear-screen=false scripts/cli.ts server",
|
||||
"client": "tsx scripts/cli.ts client"
|
||||
},
|
||||
"dependencies": {
|
||||
"ajv": "^8.17.1",
|
||||
|
|
|
|||
161
scripts/cli.ts
Normal file
161
scripts/cli.ts
Normal file
|
|
@ -0,0 +1,161 @@
|
|||
import WebSocket from 'ws';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(global as any).WebSocket = WebSocket;
|
||||
|
||||
import express from 'express';
|
||||
import { Client } from '../src/client/index.js';
|
||||
import { SSEClientTransport } from '../src/client/sse.js';
|
||||
import { StdioClientTransport } from '../src/client/stdio.js';
|
||||
import { WebSocketClientTransport } from '../src/client/websocket.js';
|
||||
import { Server } from '../src/server/index.js';
|
||||
import { SSEServerTransport } from '../src/server/sse.js';
|
||||
import { StdioServerTransport } from '../src/server/stdio.js';
|
||||
import { ListResourcesResultSchema } from '../src/types.js';
|
||||
|
||||
async function runClient(url_or_command: string, args: string[]) {
|
||||
const client = new Client(
|
||||
{
|
||||
name: 'mcp-typescript test client',
|
||||
version: '0.1.0'
|
||||
},
|
||||
{
|
||||
capabilities: {
|
||||
sampling: {}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
let clientTransport;
|
||||
|
||||
let url: URL | undefined = undefined;
|
||||
try {
|
||||
url = new URL(url_or_command);
|
||||
} catch {
|
||||
// Ignore
|
||||
}
|
||||
|
||||
if (url?.protocol === 'http:' || url?.protocol === 'https:') {
|
||||
clientTransport = new SSEClientTransport(new URL(url_or_command));
|
||||
} else if (url?.protocol === 'ws:' || url?.protocol === 'wss:') {
|
||||
clientTransport = new WebSocketClientTransport(new URL(url_or_command));
|
||||
} else {
|
||||
clientTransport = new StdioClientTransport({
|
||||
command: url_or_command,
|
||||
args
|
||||
});
|
||||
}
|
||||
|
||||
console.log('Connected to server.');
|
||||
|
||||
await client.connect(clientTransport);
|
||||
console.log('Initialized.');
|
||||
|
||||
await client.request({ method: 'resources/list' }, ListResourcesResultSchema);
|
||||
|
||||
await client.close();
|
||||
console.log('Closed.');
|
||||
}
|
||||
|
||||
async function runServer(port: number | null) {
|
||||
if (port !== null) {
|
||||
const app = express();
|
||||
|
||||
let servers: Server[] = [];
|
||||
|
||||
app.get('/sse', async (req, res) => {
|
||||
console.log('Got new SSE connection');
|
||||
|
||||
const transport = new SSEServerTransport('/message', res);
|
||||
const server = new Server(
|
||||
{
|
||||
name: 'mcp-typescript test server',
|
||||
version: '0.1.0'
|
||||
},
|
||||
{
|
||||
capabilities: {}
|
||||
}
|
||||
);
|
||||
|
||||
servers.push(server);
|
||||
|
||||
server.onclose = () => {
|
||||
console.log('SSE connection closed');
|
||||
servers = servers.filter(s => s !== server);
|
||||
};
|
||||
|
||||
await server.connect(transport);
|
||||
});
|
||||
|
||||
app.post('/message', async (req, res) => {
|
||||
console.log('Received message');
|
||||
|
||||
const sessionId = req.query.sessionId as string;
|
||||
const transport = servers.map(s => s.transport as SSEServerTransport).find(t => t.sessionId === sessionId);
|
||||
if (!transport) {
|
||||
res.status(404).send('Session not found');
|
||||
return;
|
||||
}
|
||||
|
||||
await transport.handlePostMessage(req, res);
|
||||
});
|
||||
|
||||
app.listen(port, error => {
|
||||
if (error) {
|
||||
console.error('Failed to start server:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
console.log(`Server running on http://localhost:${port}/sse`);
|
||||
});
|
||||
} else {
|
||||
const server = new Server(
|
||||
{
|
||||
name: 'mcp-typescript test server',
|
||||
version: '0.1.0'
|
||||
},
|
||||
{
|
||||
capabilities: {
|
||||
prompts: {},
|
||||
resources: {},
|
||||
tools: {},
|
||||
logging: {}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
const transport = new StdioServerTransport();
|
||||
await server.connect(transport);
|
||||
|
||||
console.log('Server running on stdio');
|
||||
}
|
||||
}
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
const command = args[0];
|
||||
switch (command) {
|
||||
case 'client':
|
||||
if (args.length < 2) {
|
||||
console.error('Usage: client <server_url_or_command> [args...]');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
runClient(args[1], args.slice(2)).catch(error => {
|
||||
console.error(error);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
break;
|
||||
|
||||
case 'server': {
|
||||
const port = args[1] ? parseInt(args[1]) : null;
|
||||
runServer(port).catch(error => {
|
||||
console.error(error);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
console.error('Unrecognized command:', command);
|
||||
}
|
||||
Loading…
Reference in a new issue