index.ts•3.6 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import keychainService from "./services/keychain.js";
import keytar from 'keytar';
// Create an MCP server
const server = new McpServer({
  name: "ServeMyAPI",
  version: "1.0.0"
});
// Tool to store an API key
server.tool(
  "store-api-key",
  {
    name: z.string().min(1).describe("The name/identifier for the API key"),
    key: z.string().min(1).describe("The API key to store"),
  },
  async ({ name, key }) => {
    try {
      await keychainService.storeKey(name, key);
      return {
        content: [{ 
          type: "text", 
          text: `Successfully stored API key with name: ${name}` 
        }]
      };
    } catch (error) {
      return {
        content: [{ 
          type: "text", 
          text: `Error storing API key: ${(error as Error).message}` 
        }],
        isError: true
      };
    }
  }
);
// Tool to retrieve an API key
server.tool(
  "get-api-key",
  {
    name: z.string().min(1).describe("The name/identifier of the API key to retrieve"),
  },
  async ({ name }) => {
    try {
      const key = await keychainService.getKey(name);
      
      if (!key) {
        return {
          content: [{ 
            type: "text", 
            text: `No API key found with name: ${name}` 
          }],
          isError: true
        };
      }
      
      return {
        content: [{ 
          type: "text", 
          text: key
        }]
      };
    } catch (error) {
      return {
        content: [{ 
          type: "text", 
          text: `Error retrieving API key: ${(error as Error).message}` 
        }],
        isError: true
      };
    }
  }
);
// Tool to delete an API key
server.tool(
  "delete-api-key",
  {
    name: z.string().min(1).describe("The name/identifier of the API key to delete"),
  },
  async ({ name }) => {
    try {
      const success = await keychainService.deleteKey(name);
      
      if (!success) {
        return {
          content: [{ 
            type: "text", 
            text: `No API key found with name: ${name}` 
          }],
          isError: true
        };
      }
      
      return {
        content: [{ 
          type: "text", 
          text: `Successfully deleted API key with name: ${name}` 
        }]
      };
    } catch (error) {
      return {
        content: [{ 
          type: "text", 
          text: `Error deleting API key: ${(error as Error).message}` 
        }],
        isError: true
      };
    }
  }
);
// Tool to list all stored API keys
server.tool(
  "list-api-keys",
  {},
  async () => {
    try {
      const keys = await keychainService.listKeys();
      
      if (keys.length === 0) {
        return {
          content: [{ 
            type: "text", 
            text: "No API keys found" 
          }]
        };
      }
      
      return {
        content: [{ 
          type: "text", 
          text: `Available API keys:\n${keys.join("\n")}` 
        }]
      };
    } catch (error) {
      return {
        content: [{ 
          type: "text", 
          text: `Error listing API keys: ${(error as Error).message}` 
        }],
        isError: true
      };
    }
  }
);
// Start receiving messages on stdin and sending messages on stdout
const transport = new StdioServerTransport();
server.connect(transport).then(() => {
  console.error("ServeMyAPI MCP server is running...");
}).catch(error => {
  console.error("Error starting ServeMyAPI MCP server:", error);
});