52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import { z } from "zod"
|
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"
|
|
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"
|
|
import packageJSON from "../../package.json"
|
|
import { description } from "./desc.js"
|
|
|
|
export function getServer() {
|
|
const server = new McpServer(
|
|
{
|
|
name: "NewsNow",
|
|
version: packageJSON.version,
|
|
},
|
|
{ capabilities: { logging: {} } },
|
|
)
|
|
|
|
server.tool(
|
|
"get_hotest_latest_news",
|
|
`get hotest or latest news from source by {id}, return {count: 10} news.`,
|
|
{
|
|
id: z.string().describe(`source id. e.g. ${description}`),
|
|
count: z.any().default(10).describe("count of news to return."),
|
|
},
|
|
async ({ count }): Promise<CallToolResult> => {
|
|
let n = Number(count)
|
|
if (Number.isNaN(n) || n < 1) {
|
|
n = 10
|
|
}
|
|
await delay(5000)
|
|
return {
|
|
content: [{
|
|
text: "hello",
|
|
type: "text",
|
|
}],
|
|
}
|
|
|
|
// const res: SourceResponse = await $fetch(`https://newsnow.busiyi.world/api/s?id=${id}`)
|
|
// return {
|
|
// content: res.items.slice(0, count).map((item) => {
|
|
// return {
|
|
// text: `[${item.title}](${item.url})`,
|
|
// type: "text",
|
|
// }
|
|
// }),
|
|
// }
|
|
},
|
|
)
|
|
|
|
server.server.onerror = console.error.bind(console)
|
|
|
|
return server
|
|
}
|