index.ts•3.89 kB
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { searchStock, fetchStockData, fetchStockHistory, fetchMarketIndex } from "./api.js";
import { formatStockInfo, formatHistoryData, formatIndexInfo } from "./formatters.js";
// Create server instance
const server = new McpServer({
name: "stock-assistant",
version: "1.0.0",
});
// Register stock info tool
server.tool(
"get-stock-info",
"获取单个股票的实时当前信息,包括当前价格、涨跌幅、成交量等实时数据",
{
stock_code: z
.string()
.describe("股票代码或名称 (例如: 600519 或 贵州茅台)"),
},
async ({ stock_code }) => {
const stockData = await fetchStockData(stock_code);
if (!stockData) {
return {
content: [
{
type: "text",
text: `无法获取股票 ${stock_code} 的数据。请检查输入是否正确。`,
},
],
};
}
return {
content: [
{
type: "text",
text: formatStockInfo(stockData),
},
],
};
}
);
// Register stock history tool
server.tool(
"get-stock-history",
"获取单个股票的历史数据、过去价格、K线数据,支持日K、周K、月K线,用于分析股票过去的表现",
{
stock_code: z
.string()
.describe("股票代码或名称 (例如: 600519 或 贵州茅台)"),
period: z
.enum(["1d", "1w", "1m"])
.default("1d")
.describe("时间周期: 1d=日K线, 1w=周K线, 1m=月K线"),
days: z
.number()
.min(1)
.max(500)
.default(30)
.describe("获取天数 (1-500天)"),
},
async ({ stock_code, period, days }) => {
// Convert period to API format
const periodMap = { "1d": "101", "1w": "102", "1m": "103" };
const apiPeriod = periodMap[period];
const historyData = await fetchStockHistory(stock_code, apiPeriod, days);
if (!historyData || historyData.length === 0) {
return {
content: [
{
type: "text",
text: `无法获取股票 ${stock_code} 的历史数据。请检查输入是否正确。`,
},
],
};
}
// Get stock name for display
let stockName = stock_code;
if (!stock_code.match(/^\d{6}$/)) {
const searchResult = await searchStock(stock_code);
if (searchResult) {
stockName = `${searchResult[1]}(${searchResult[0]})`;
}
} else {
// Try to get name from current data
const currentData = await fetchStockData(stock_code);
if (currentData) {
stockName = `${currentData.name}(${currentData.code})`;
}
}
return {
content: [
{
type: "text",
text: formatHistoryData(historyData, stockName),
},
],
};
}
);
// Register market index tool
server.tool(
"get-market-index",
"获取大盘指数概览信息,包括上证指数和深证成指等主要指数的实时数据",
{},
async () => {
const indexData = await fetchMarketIndex();
if (!indexData || indexData.length === 0) {
return {
content: [
{
type: "text",
text: "无法获取大盘指数数据,请稍后重试。",
},
],
};
}
return {
content: [
{
type: "text",
text: formatIndexInfo(indexData),
},
],
};
}
);
// Start the server
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Stock Assistant MCP Server running on stdio");
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});