import {Server, ProtocolError} from '@modelcontextprotocol/server';
import {serveStdio, StdioServerTransport} from '@modelcontextprotocol/server/stdio';
import {Intent} from '@devcodex/intent-runtime';
import {attachIntentTools} from './attach.mjs';
// A complete host-mode example: no additional model API credentials.
const intent = new Intent({language: 'zh-CN', schema: {
type: 'object', properties: {orderId: {type: 'string', description: '明确订单编号,保留前导零'}},
}});
const transport = new StdioServerTransport();
const attached = new Set();
const handle = serveStdio(() => {
const server = new Server({name: 'intent-tools-example', version: '1.0.0'}, {
capabilities: {tools: {}, resources: {}, prompts: {}},
supportedProtocolVersions: ['2025-06-18', '2025-11-25', '2026-07-28'],
});
const original = {
async listTools() {return [{name: 'ping', description: 'Return pong.', inputSchema: {type: 'object', properties: {}, additionalProperties: false}, outputSchema: {type: 'object', properties: {message: {type: 'string'}}, required: ['message']}}];},
async callTool(name) {
if (name !== 'ping') throw new ProtocolError(-32602, 'Unknown tool');
const data = {message: 'pong'};
return {...(server.getNegotiatedProtocolVersion() === '2026-07-28' ? {resultType: 'complete'} : {}), isError: false, content: [{type: 'text', text: JSON.stringify(data)}], structuredContent: data};
},
};
let bridge;
// Created after protocol negotiation, once for this logical SDK connection.
const tools = () => bridge ??= attachIntentTools(original, {mode: 'host', instances: {orders: intent}, toolPrefix: 'ir_'}, {protocolVersion: server.getNegotiatedProtocolVersion()});
server.setRequestHandler('tools/list', async () => ({tools: await (await tools()).listTools()}));
server.setRequestHandler('tools/call', async (request, context) => (await tools()).callTool(request.params.name, request.params.arguments ?? {}, {signal: context.mcpReq.signal}));
server.setRequestHandler('resources/list', async () => ({resources: [{uri: 'note://welcome', name: 'welcome', mimeType: 'text/plain'}]}));
server.setRequestHandler('resources/read', async request => {
if (request.params.uri !== 'note://welcome') throw new ProtocolError(-32602, 'Unknown resource');
return {contents: [{uri: 'note://welcome', mimeType: 'text/plain', text: 'Existing resource'}]};
});
server.setRequestHandler('prompts/list', async () => ({prompts: [{name: 'welcome', description: 'Existing prompt'}]}));
server.setRequestHandler('prompts/get', async request => {
if (request.params.name !== 'welcome') throw new ProtocolError(-32602, 'Unknown prompt');
return {messages: [{role: 'user', content: {type: 'text', text: 'Hello'}}]};
});
const close = async () => {if (bridge) await (await bridge).close();};
attached.add(close);
server.onclose = () => {attached.delete(close); void close();};
return server;
}, {transport, onerror: () => process.stderr.write('MCP example transport failed.\n')});
let stopping;
function close() {
stopping ??= (async () => {try {await handle.close();} finally {await Promise.all([...attached].map(fn => fn())); await intent.dispose();}})();
return stopping;
}
const sdkClose = transport.onclose;
transport.onclose = () => {sdkClose?.(); void close();};
process.once('SIGINT', () => {void close();});
process.once('SIGTERM', () => {void close();});