mcp-mappers.test.ts•16 kB
import {
  mapPromptToGetPromptResult,
  mapPromptsToListPromptsResult,
  mapBlockToReadResourceResult,
  mapBlocksToListResourcesResult,
} from "../mcp-mappers.js";
import {
  mockSystemPromptResult,
  mockArrayPromptResult,
  mockNestedPromptResult,
} from "../../__tests__/mock-objects.js";
import type {
  SystempromptPromptResponse,
  SystempromptBlockResponse,
} from "../../types/systemprompt.js";
import type { GetPromptResult } from "@modelcontextprotocol/sdk/types.js";
describe("MCP Mappers", () => {
  describe("mapPromptToGetPromptResult", () => {
    it("should map a prompt with all fields", () => {
      const prompt: SystempromptPromptResponse = {
        id: "test-prompt",
        metadata: {
          title: "Test Prompt",
          description: "Test Description",
          created: "2024-01-01",
          updated: "2024-01-01",
          version: 1,
          status: "active",
          author: "test",
          log_message: "Initial version",
          tag: ["test"],
        },
        instruction: {
          static: "Test instruction",
          dynamic: "",
          state: "",
        },
        input: {
          name: "test-input",
          description: "Test input",
          type: ["object"],
          schema: {
            type: "object",
            properties: {
              testArg: {
                type: "string",
                description: "Test argument",
              },
              requiredArg: {
                type: "string",
                description: "Required argument",
              },
            },
            required: ["requiredArg"],
          },
        },
        output: {
          name: "test-output",
          description: "Test output",
          type: ["object"],
          schema: {
            type: "object",
            properties: {},
          },
        },
        _link: "test-link",
      };
      const result = mapPromptToGetPromptResult(prompt);
      expect(result).toEqual({
        name: "Test Prompt",
        description: "Test Description",
        messages: [
          {
            role: "assistant",
            content: {
              type: "text",
              text: "Test instruction",
            },
          },
        ],
        arguments: [
          {
            name: "testArg",
            description: "Test argument",
            required: false,
          },
          {
            name: "requiredArg",
            description: "Required argument",
            required: true,
          },
        ],
        tools: [],
        _meta: { prompt },
      });
    });
    it("should handle missing optional fields", () => {
      const prompt: SystempromptPromptResponse = {
        id: "test-prompt-2",
        metadata: {
          title: "Test Prompt",
          description: "Test Description",
          created: "2024-01-01",
          updated: "2024-01-01",
          version: 1,
          status: "active",
          author: "test",
          log_message: "Initial version",
          tag: ["test"],
        },
        instruction: {
          static: "Test instruction",
          dynamic: "",
          state: "",
        },
        input: {
          name: "test-input",
          description: "Test input",
          type: ["object"],
          schema: {
            type: "object",
            properties: {},
          },
        },
        output: {
          name: "test-output",
          description: "Test output",
          type: ["object"],
          schema: {
            type: "object",
            properties: {},
          },
        },
        _link: "test-link",
      };
      const result = mapPromptToGetPromptResult(prompt);
      expect(result).toEqual({
        name: "Test Prompt",
        description: "Test Description",
        messages: [
          {
            role: "assistant",
            content: {
              type: "text",
              text: "Test instruction",
            },
          },
        ],
        arguments: [],
        tools: [],
        _meta: { prompt },
      });
    });
    it("should handle invalid argument schemas", () => {
      const prompt: SystempromptPromptResponse = {
        id: "test-prompt-3",
        metadata: {
          title: "Test Prompt",
          description: "Test Description",
          created: "2024-01-01",
          updated: "2024-01-01",
          version: 1,
          status: "active",
          author: "test",
          log_message: "Initial version",
          tag: ["test"],
        },
        instruction: {
          static: "Test instruction",
          dynamic: "",
          state: "",
        },
        input: {
          name: "test-input",
          description: "Test input",
          type: ["object"],
          schema: {
            type: "object",
            properties: {
              boolProp: { type: "boolean" },
              nullProp: { type: "null" },
              stringProp: { type: "string" },
              validProp: {
                type: "string",
                description: "Valid property",
              },
            },
            required: ["validProp"],
          },
        },
        output: {
          name: "test-output",
          description: "Test output",
          type: ["object"],
          schema: {
            type: "object",
            properties: {},
          },
        },
        _link: "test-link",
      };
      const result = mapPromptToGetPromptResult(prompt);
      expect(result.arguments).toEqual([
        {
          name: "boolProp",
          description: "",
          required: false,
        },
        {
          name: "nullProp",
          description: "",
          required: false,
        },
        {
          name: "stringProp",
          description: "",
          required: false,
        },
        {
          name: "validProp",
          description: "Valid property",
          required: true,
        },
      ]);
    });
    it("should correctly map a single prompt to GetPromptResult format", () => {
      const result = mapPromptToGetPromptResult(mockSystemPromptResult);
      expect(result.name).toBe(mockSystemPromptResult.metadata.title);
      expect(result.description).toBe(
        mockSystemPromptResult.metadata.description
      );
      expect(result.messages).toEqual([
        {
          role: "assistant",
          content: {
            type: "text",
            text: mockSystemPromptResult.instruction.static,
          },
        },
      ]);
      expect(result.tools).toEqual([]);
      expect(result._meta).toEqual({ prompt: mockSystemPromptResult });
    });
    it("should handle prompts with array inputs", () => {
      const result = mapPromptToGetPromptResult(mockArrayPromptResult);
      expect(result.name).toBe(mockArrayPromptResult.metadata.title);
      expect(result.description).toBe(
        mockArrayPromptResult.metadata.description
      );
      expect(result.messages).toEqual([
        {
          role: "assistant",
          content: {
            type: "text",
            text: mockArrayPromptResult.instruction.static,
          },
        },
      ]);
      expect(result.tools).toEqual([]);
      expect(result._meta).toEqual({ prompt: mockArrayPromptResult });
    });
    it("should handle prompts with nested object inputs", () => {
      const result = mapPromptToGetPromptResult(mockNestedPromptResult);
      expect(result.name).toBe(mockNestedPromptResult.metadata.title);
      expect(result.description).toBe(
        mockNestedPromptResult.metadata.description
      );
      expect(result.messages).toEqual([
        {
          role: "assistant",
          content: {
            type: "text",
            text: mockNestedPromptResult.instruction.static,
          },
        },
      ]);
      expect(result.tools).toEqual([]);
      expect(result._meta).toEqual({ prompt: mockNestedPromptResult });
    });
  });
  describe("mapPromptsToListPromptsResult", () => {
    it("should map an array of prompts", () => {
      const prompts: SystempromptPromptResponse[] = [
        {
          id: "prompt-1",
          metadata: {
            title: "Prompt 1",
            description: "Description 1",
            created: "2024-01-01",
            updated: "2024-01-01",
            version: 1,
            status: "active",
            author: "test",
            log_message: "Initial version",
            tag: ["test"],
          },
          instruction: {
            static: "Instruction 1",
            dynamic: "",
            state: "",
          },
          input: {
            name: "input-1",
            description: "Input 1",
            type: ["object"],
            schema: {
              type: "object",
              properties: {},
            },
          },
          output: {
            name: "output-1",
            description: "Output 1",
            type: ["object"],
            schema: {
              type: "object",
              properties: {},
            },
          },
          _link: "link-1",
        },
        {
          id: "prompt-2",
          metadata: {
            title: "Prompt 2",
            description: "Description 2",
            created: "2024-01-01",
            updated: "2024-01-01",
            version: 1,
            status: "active",
            author: "test",
            log_message: "Initial version",
            tag: ["test"],
          },
          instruction: {
            static: "Instruction 2",
            dynamic: "",
            state: "",
          },
          input: {
            name: "input-2",
            description: "Input 2",
            type: ["object"],
            schema: {
              type: "object",
              properties: {},
            },
          },
          output: {
            name: "output-2",
            description: "Output 2",
            type: ["object"],
            schema: {
              type: "object",
              properties: {},
            },
          },
          _link: "link-2",
        },
      ];
      const result = mapPromptsToListPromptsResult(prompts);
      expect(result).toEqual({
        _meta: { prompts },
        prompts: [
          {
            name: "Prompt 1",
            description: "Description 1",
            arguments: [],
          },
          {
            name: "Prompt 2",
            description: "Description 2",
            arguments: [],
          },
        ],
      });
    });
    it("should handle empty prompt array", () => {
      const result = mapPromptsToListPromptsResult([]);
      expect(result.prompts).toHaveLength(0);
      expect(result._meta).toEqual({ prompts: [] });
    });
  });
  describe("mapBlockToReadResourceResult", () => {
    const mockBlock: SystempromptBlockResponse = {
      id: "block-123",
      content: "Test block content",
      prefix: "{{message}}",
      metadata: {
        title: "Test Block",
        description: "Test block description",
        created: new Date().toISOString(),
        updated: new Date().toISOString(),
        version: 1,
        status: "published",
        author: "test-user",
        log_message: "Initial creation",
        tag: ["test"],
      },
    };
    it("should map a block to read resource result", () => {
      const block: SystempromptBlockResponse = {
        id: "test-block",
        prefix: "test-prefix",
        metadata: {
          title: "Test Block",
          description: "Test Description",
          created: "2024-01-01",
          updated: "2024-01-01",
          version: 1,
          status: "active",
          author: "test",
          log_message: "Initial version",
          tag: ["test"],
        },
        content: "Test content",
        _link: "test-link",
      };
      const result = mapBlockToReadResourceResult(block);
      expect(result).toEqual({
        contents: [
          {
            uri: "resource:///block/test-block",
            mimeType: "text/plain",
            text: "Test content",
          },
        ],
        _meta: {},
      });
    });
    it("should correctly map a single block to ReadResourceResult format", () => {
      const result = mapBlockToReadResourceResult(mockBlock);
      expect(result.contents).toHaveLength(1);
      expect(result.contents[0]).toEqual({
        uri: `resource:///block/${mockBlock.id}`,
        mimeType: "text/plain",
        text: mockBlock.content,
      });
      expect(result._meta).toEqual({});
    });
  });
  describe("mapBlocksToListResourcesResult", () => {
    const mockBlocks: SystempromptBlockResponse[] = [
      {
        id: "block-123",
        content: "Test block content 1",
        prefix: "{{message}}",
        metadata: {
          title: "Test Block 1",
          description: "Test block description 1",
          created: new Date().toISOString(),
          updated: new Date().toISOString(),
          version: 1,
          status: "published",
          author: "test-user",
          log_message: "Initial creation",
          tag: ["test"],
        },
      },
      {
        id: "block-456",
        content: "Test block content 2",
        prefix: "{{message}}",
        metadata: {
          title: "Test Block 2",
          description: null,
          created: new Date().toISOString(),
          updated: new Date().toISOString(),
          version: 1,
          status: "published",
          author: "test-user",
          log_message: "Initial creation",
          tag: ["test"],
        },
      },
    ];
    it("should map blocks to list resources result", () => {
      const blocks: SystempromptBlockResponse[] = [
        {
          id: "block-1",
          prefix: "prefix-1",
          metadata: {
            title: "Block 1",
            description: "Description 1",
            created: "2024-01-01",
            updated: "2024-01-01",
            version: 1,
            status: "active",
            author: "test",
            log_message: "Initial version",
            tag: ["test"],
          },
          content: "Content 1",
          _link: "link-1",
        },
        {
          id: "block-2",
          prefix: "prefix-2",
          metadata: {
            title: "Block 2",
            description: "Description 2",
            created: "2024-01-01",
            updated: "2024-01-01",
            version: 1,
            status: "active",
            author: "test",
            log_message: "Initial version",
            tag: ["test"],
          },
          content: "Content 2",
          _link: "link-2",
        },
      ];
      const result = mapBlocksToListResourcesResult(blocks);
      expect(result).toEqual({
        _meta: {},
        resources: [
          {
            uri: "resource:///block/block-1",
            name: "Block 1",
            description: "Description 1",
            mimeType: "text/plain",
          },
          {
            uri: "resource:///block/block-2",
            name: "Block 2",
            description: "Description 2",
            mimeType: "text/plain",
          },
        ],
      });
    });
    it("should correctly map an array of blocks to ListResourcesResult format", () => {
      const result = mapBlocksToListResourcesResult(mockBlocks);
      expect(result.resources).toHaveLength(2);
      expect(result.resources[0]).toEqual({
        uri: `resource:///block/${mockBlocks[0].id}`,
        name: mockBlocks[0].metadata.title,
        description: mockBlocks[0].metadata.description,
        mimeType: "text/plain",
      });
      expect(result.resources[1]).toEqual({
        uri: `resource:///block/${mockBlocks[1].id}`,
        name: mockBlocks[1].metadata.title,
        description: undefined,
        mimeType: "text/plain",
      });
      expect(result._meta).toEqual({});
    });
    it("should handle empty block array", () => {
      const result = mapBlocksToListResourcesResult([]);
      expect(result.resources).toHaveLength(0);
      expect(result._meta).toEqual({});
    });
  });
});