feat: init
This commit is contained in:
commit
3fa745c7dc
4 files changed
+3799
No files matched your search
@@ -0,0 +1 @@
|
|||||||
|
node_modules
|
||||||
@@ -0,0 +1,188 @@
|
|||||||
|
// 引入必要的模块
|
||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
||||||
|
import { z } from "zod";
|
||||||
|
import open, { openApp, apps } from "open";
|
||||||
|
|
||||||
|
// 创建 MCP 服务器实例
|
||||||
|
// 为其设置一个名字和版本
|
||||||
|
const server = new McpServer(
|
||||||
|
{
|
||||||
|
name: "local-open-mcp",
|
||||||
|
version: "1.0.0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
capabilities: {
|
||||||
|
prompts: {},
|
||||||
|
tools: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
server.registerTool(
|
||||||
|
'open_url',
|
||||||
|
{
|
||||||
|
description: "打开指定的URL链接",
|
||||||
|
inputSchema: z.object({
|
||||||
|
url: z.string().describe("URL链接"),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
|
||||||
|
async ({ url }) => {
|
||||||
|
try {
|
||||||
|
|
||||||
|
await open(url);
|
||||||
|
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `已打开URL: ${url}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `打开URL失败: ${error.message}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
isError: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
server.registerTool(
|
||||||
|
'open_file',
|
||||||
|
{
|
||||||
|
description: "打开指定的本地文件",
|
||||||
|
inputSchema: z.object({
|
||||||
|
filePath: z.string().describe("文件路径"),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
|
||||||
|
async ({ filePath }) => {
|
||||||
|
try {
|
||||||
|
|
||||||
|
await open(filePath);
|
||||||
|
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `已打开文件: ${filePath}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `打开文件失败: ${error.message}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
isError: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
server.registerTool(
|
||||||
|
'open_directory',
|
||||||
|
{
|
||||||
|
description: "打开指定的本地文件夹",
|
||||||
|
inputSchema: z.object({
|
||||||
|
directoryPath: z.string().describe("文件夹路径"),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
|
||||||
|
async ({ directoryPath }) => {
|
||||||
|
try {
|
||||||
|
|
||||||
|
await open(directoryPath);
|
||||||
|
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `已打开文件夹: ${directoryPath}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `打开文件夹失败: ${error.message}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
isError: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
server.registerTool(
|
||||||
|
'open_app',
|
||||||
|
{
|
||||||
|
description: "打开指定的本地应用程序",
|
||||||
|
inputSchema: z.object({
|
||||||
|
appName: z.string().describe("应用程序名称"),
|
||||||
|
args: z.array(z.string()).optional().describe("传递给应用程序的可选参数"),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
|
||||||
|
async ({ appName, args }) => {
|
||||||
|
try {
|
||||||
|
|
||||||
|
await openApp(appName, {arguments: args});
|
||||||
|
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `已打开应用程序: ${appName}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `打开应用程序失败: ${error.message}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
isError: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 启动服务器,使用标准输入/输出(stdio)与客户端通信
|
||||||
|
async function main() {
|
||||||
|
const transport = new StdioServerTransport();
|
||||||
|
await server.connect(transport);
|
||||||
|
console.error("Open Local MCP 服务器已通过 stdio 启动"); // 日志输出到 stderr
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 运行主函数,并捕获可能的错误
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error("服务器运行出现致命错误:", error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
export { server };
|
||||||
Generated
+3582
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "local-open-mcp",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js",
|
||||||
|
"dev": "npx @modelcontextprotocol/inspector node index.js"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"mcp",
|
||||||
|
"local open",
|
||||||
|
"open url",
|
||||||
|
"open file",
|
||||||
|
"open directory"
|
||||||
|
],
|
||||||
|
"author": "Jasery",
|
||||||
|
"license": "ISC",
|
||||||
|
"description": "A Model Context Protocol server for Opening local files, directories, url and applications.",
|
||||||
|
"dependencies": {
|
||||||
|
"@modelcontextprotocol/sdk": "^1.22.0",
|
||||||
|
"open": "^11.0.0",
|
||||||
|
"zod": "^3.25.76"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@modelcontextprotocol/inspector": "^0.17.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user