Skip to main content
Glama

Karakeep MCP server

by karakeep-app
highlights.test.ts7.29 kB
import { beforeEach, describe, expect, test } from "vitest"; import { BookmarkTypes } from "@karakeep/shared/types/bookmarks"; import type { CustomTestContext } from "../testUtils"; import { defaultBeforeEach } from "../testUtils"; beforeEach<CustomTestContext>(defaultBeforeEach(true)); describe("Highlight Routes", () => { test<CustomTestContext>("create highlight", async ({ apiCallers }) => { const api = apiCallers[0].highlights; const bookmarksApi = apiCallers[0].bookmarks; // First, create a valid bookmark const bookmark = await bookmarksApi.createBookmark({ url: "https://example.com", type: BookmarkTypes.LINK, }); const bookmarkId = bookmark.id; const highlight = await api.create({ bookmarkId, startOffset: 10, endOffset: 20, color: "yellow", text: "Test highlight text", note: "Test note", }); const res = await api.get({ highlightId: highlight.id }); expect(res.bookmarkId).toEqual(bookmarkId); expect(res.startOffset).toEqual(10); expect(res.endOffset).toEqual(20); expect(res.color).toEqual("yellow"); expect(res.text).toEqual("Test highlight text"); expect(res.note).toEqual("Test note"); }); test<CustomTestContext>("delete highlight", async ({ apiCallers }) => { const api = apiCallers[0].highlights; const bookmarksApi = apiCallers[0].bookmarks; // First, create a valid bookmark const bookmark = await bookmarksApi.createBookmark({ url: "https://example.com", type: BookmarkTypes.LINK, }); const bookmarkId = bookmark.id; // Create the highlight first const highlight = await api.create({ bookmarkId, startOffset: 10, endOffset: 20, color: "yellow", text: "Test highlight text", note: "Test note", }); // It should exist await api.get({ highlightId: highlight.id }); // Delete it await api.delete({ highlightId: highlight.id }); // It shouldn't be there anymore await expect(() => api.get({ highlightId: highlight.id })).rejects.toThrow( /Highlight not found/, ); }); test<CustomTestContext>("update highlight", async ({ apiCallers }) => { const api = apiCallers[0].highlights; const bookmarksApi = apiCallers[0].bookmarks; // First, create a valid bookmark const bookmark = await bookmarksApi.createBookmark({ url: "https://example.com", type: BookmarkTypes.LINK, }); const bookmarkId = bookmark.id; // Create the highlight const highlight = await api.create({ bookmarkId, startOffset: 10, endOffset: 20, color: "yellow", text: "Original text", note: "Original note", }); await api.update({ highlightId: highlight.id, color: "blue", }); const res = await api.get({ highlightId: highlight.id }); expect(res.color).toEqual("blue"); expect(res.text).toEqual("Original text"); // Only color is updated in the router }); test<CustomTestContext>("get highlight", async ({ apiCallers }) => { const api = apiCallers[0].highlights; const bookmarksApi = apiCallers[0].bookmarks; // First, create a valid bookmark const bookmark = await bookmarksApi.createBookmark({ url: "https://example.com", type: BookmarkTypes.LINK, }); const bookmarkId = bookmark.id; // Create the highlight const createdHighlight = await api.create({ bookmarkId, startOffset: 10, endOffset: 20, color: "yellow", text: "Test text", note: "Test note", }); const res = await api.get({ highlightId: createdHighlight.id }); expect(res.id).toEqual(createdHighlight.id); expect(res.bookmarkId).toEqual(bookmarkId); }); test<CustomTestContext>("get highlights for bookmark", async ({ apiCallers, }) => { const api = apiCallers[0].highlights; const bookmarksApi = apiCallers[0].bookmarks; const bookmark = await bookmarksApi.createBookmark({ url: "https://example.com", type: BookmarkTypes.LINK, }); const bookmarkId = bookmark.id; const highlight1 = await api.create({ bookmarkId, startOffset: 10, endOffset: 20, color: "yellow", text: "Highlight 1", note: "", }); const highlight2 = await api.create({ bookmarkId, startOffset: 30, endOffset: 40, color: "blue", text: "Highlight 2", note: "", }); const res = await api.getForBookmark({ bookmarkId }); expect(res.highlights.length).toBeGreaterThanOrEqual(2); expect(res.highlights.some((h) => h.id === highlight1.id)).toBeTruthy(); expect(res.highlights.some((h) => h.id === highlight2.id)).toBeTruthy(); }); test<CustomTestContext>("get all highlights with pagination", async ({ apiCallers, }) => { const api = apiCallers[0].highlights; const bookmarksApi = apiCallers[0].bookmarks; const bookmark = await bookmarksApi.createBookmark({ url: "https://example.com", type: BookmarkTypes.LINK, }); const bookmarkId = bookmark.id; // Create multiple highlights await api.create({ bookmarkId, startOffset: 10, endOffset: 20, color: "yellow", text: "Highlight 1", note: "", }); await api.create({ bookmarkId, startOffset: 30, endOffset: 40, color: "blue", text: "Highlight 2", note: "", }); await api.create({ bookmarkId, startOffset: 50, endOffset: 60, color: "green", text: "Highlight 3", note: "", }); const res = await api.getAll({ limit: 2 }); expect(res.highlights.length).toEqual(2); expect(res.nextCursor).toBeDefined(); // Should have a next cursor }); test<CustomTestContext>("privacy for highlights", async ({ apiCallers }) => { const apiUser1 = apiCallers[0].highlights; const apiUser2 = apiCallers[1].highlights; const bookmarksApiUser1 = apiCallers[0].bookmarks; const bookmarksApiUser2 = apiCallers[1].bookmarks; const bookmarkUser1 = await bookmarksApiUser1.createBookmark({ url: "https://user1-example.com", type: BookmarkTypes.LINK, }); const bookmarkIdUser1 = bookmarkUser1.id; const bookmarkUser2 = await bookmarksApiUser2.createBookmark({ url: "https://user2-example.com", type: BookmarkTypes.LINK, }); const bookmarkIdUser2 = bookmarkUser2.id; const highlightUser1 = await apiUser1.create({ bookmarkId: bookmarkIdUser1, startOffset: 10, endOffset: 20, color: "yellow", text: "User1 highlight", note: "", }); const highlightUser2 = await apiUser2.create({ bookmarkId: bookmarkIdUser2, startOffset: 10, endOffset: 20, color: "blue", text: "User2 highlight", note: "", }); // User1 should not access User2's highlight await expect(() => apiUser1.get({ highlightId: highlightUser2.id }), ).rejects.toThrow(/User is not allowed to access resource/); // User2 should not access User1's highlight await expect(() => apiUser2.get({ highlightId: highlightUser1.id }), ).rejects.toThrow(/User is not allowed to access resource/); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/karakeep-app/karakeep'

If you have feedback or need assistance with the MCP directory API, please join our Discord server