Skip to main content
Glama

Karakeep MCP server

by karakeep-app
LinkCard.tsx2.9 kB
"use client"; import Image from "next/image"; import Link from "next/link"; import { useUserSettings } from "@/lib/userSettings"; import type { ZBookmarkTypeLink } from "@karakeep/shared/types/bookmarks"; import { getBookmarkLinkImageUrl, getBookmarkTitle, getSourceUrl, isBookmarkStillCrawling, } from "@karakeep/shared/utils/bookmarkUtils"; import { BookmarkLayoutAdaptingCard } from "./BookmarkLayoutAdaptingCard"; import FooterLinkURL from "./FooterLinkURL"; const useOnClickUrl = (bookmark: ZBookmarkTypeLink) => { const userSettings = useUserSettings(); return { urlTarget: userSettings.bookmarkClickAction === "open_original_link" ? ("_blank" as const) : ("_self" as const), onClickUrl: userSettings.bookmarkClickAction === "expand_bookmark_preview" ? `/dashboard/preview/${bookmark.id}` : bookmark.content.url, }; }; function LinkTitle({ bookmark }: { bookmark: ZBookmarkTypeLink }) { const { onClickUrl, urlTarget } = useOnClickUrl(bookmark); const parsedUrl = new URL(bookmark.content.url); return ( <Link href={onClickUrl} target={urlTarget} rel="noreferrer"> {getBookmarkTitle(bookmark) ?? parsedUrl.host} </Link> ); } function LinkImage({ bookmark, className, }: { bookmark: ZBookmarkTypeLink; className?: string; }) { const { onClickUrl, urlTarget } = useOnClickUrl(bookmark); const link = bookmark.content; const imgComponent = (url: string, unoptimized: boolean) => ( <Image unoptimized={unoptimized} className={className} alt="card banner" fill={true} src={url} /> ); const imageDetails = getBookmarkLinkImageUrl(link); let img: React.ReactNode; if (isBookmarkStillCrawling(bookmark)) { img = imgComponent("/blur.avif", false); } else if (imageDetails) { img = imgComponent(imageDetails.url, !imageDetails.localAsset); } else { // No image found // A dummy white pixel for when there's no image. img = imgComponent( "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdj+P///38ACfsD/QVDRcoAAAAASUVORK5CYII=", true, ); } return ( <Link href={onClickUrl} target={urlTarget} rel="noreferrer" className={className} > <div className="relative size-full flex-1">{img}</div> </Link> ); } export default function LinkCard({ bookmark: bookmarkLink, className, }: { bookmark: ZBookmarkTypeLink; className?: string; }) { return ( <BookmarkLayoutAdaptingCard title={<LinkTitle bookmark={bookmarkLink} />} footer={<FooterLinkURL url={getSourceUrl(bookmarkLink)} />} bookmark={bookmarkLink} wrapTags={false} image={(_layout, className) => ( <LinkImage className={className} bookmark={bookmarkLink} /> )} className={className} /> ); }

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