Skip to content

Bookmark Management

Complete guide to creating, reading, updating, and deleting bookmarks with the LinkDing MCP Server.

add_bookmark

Add new bookmarks to your LinkDing collection.

Parameters

Parameter Type Default Required Description
url string - The URL to bookmark
title string null Custom title (auto-scraped if not provided)
description string null Custom description (auto-scraped if not provided)
notes string null Personal notes
tags array null List of tag names
is_archived boolean false Save directly to archive
unread boolean false Mark as unread
shared boolean false Share with other users

Basic Examples

Simple Bookmark

# Minimal bookmark - title and description auto-scraped
add_bookmark(url="https://python.org")

Bookmark with Details

add_bookmark(
    url="https://fastapi.tiangolo.com",
    title="FastAPI Documentation",
    description="Modern, fast web framework for building APIs",
    tags=["python", "api", "documentation"],
    notes="Great for building REST APIs quickly"
)

Archive Immediately

add_bookmark(
    url="https://old-tutorial.com",
    tags=["tutorial", "archived"],
    is_archived=True,
    notes="Old but still useful reference"
)

Advanced Usage

Batch Adding

urls_to_add = [
    {
        "url": "https://react.dev",
        "tags": ["react", "documentation"],
        "notes": "Official React docs"
    },
    {
        "url": "https://nextjs.org",
        "tags": ["react", "nextjs", "framework"],
        "notes": "React framework for production"
    }
]

for bookmark_data in urls_to_add:
    add_bookmark(**bookmark_data)

Reading List Workflow

add_bookmark(
    url="https://long-article.com",
    tags=["to-read", "article"],
    unread=True,
    notes="Recommended by colleague"
)

get_bookmark

Retrieve detailed information about a specific bookmark.

Parameters

Parameter Type Required Description
bookmark_id integer The bookmark ID

Examples

# Get bookmark details
bookmark = get_bookmark(bookmark_id=123)

# Access bookmark properties
print(f"Title: {bookmark['title']}")
print(f"URL: {bookmark['url']}")
print(f"Tags: {bookmark['tag_names']}")

Response Format

{
  "id": 123,
  "url": "https://example.com",
  "title": "Example Site",
  "description": "An example website",
  "notes": "Personal notes here",
  "tag_names": ["example", "demo"],
  "date_added": "2024-01-15T10:30:00Z",
  "date_modified": "2024-01-16T14:20:00Z",
  "is_archived": false,
  "unread": false,
  "shared": false,
  "favicon_url": "https://example.com/favicon.ico",
  "preview_image_url": null,
  "web_archive_snapshot_url": null
}

update_bookmark

Modify existing bookmark properties.

Parameters

Parameter Type Required Description
bookmark_id integer The bookmark ID
url string New URL
title string New title
description string New description
notes string New notes
tags array New list of tag names (replaces existing)
is_archived boolean Update archived status
unread boolean Update unread status
shared boolean Update shared status

Examples

Update Tags

update_bookmark(
    bookmark_id=123,
    tags=["python", "tutorial", "advanced"]
)

Add Notes

update_bookmark(
    bookmark_id=123,
    notes="Updated with new insights from 2024 conference"
)

Mark as Read

update_bookmark(
    bookmark_id=123,
    unread=False,
    notes="Finished reading - great resource!"
)

Complete Update

update_bookmark(
    bookmark_id=123,
    title="Updated Title",
    description="Updated description with more details",
    tags=["updated", "comprehensive"],
    notes="Completely revised bookmark",
    unread=False
)

Partial Updates

You only need to specify the fields you want to change:

# Only update tags
update_bookmark(bookmark_id=123, tags=["new-tag"])

# Only add notes
update_bookmark(bookmark_id=123, notes="Important note")

# Only change archived status
update_bookmark(bookmark_id=123, is_archived=True)

delete_bookmark

Permanently remove a bookmark from your collection.

Parameters

Parameter Type Required Description
bookmark_id integer The bookmark ID

Examples

# Delete a bookmark
delete_bookmark(bookmark_id=123)

# Delete with confirmation workflow
bookmark = get_bookmark(bookmark_id=123)
print(f"About to delete: {bookmark['title']}")
confirm = input("Are you sure? (y/N): ")
if confirm.lower() == 'y':
    delete_bookmark(bookmark_id=123)

Permanent Deletion

Deleted bookmarks cannot be recovered. Consider archiving instead of deleting if you might need the bookmark later.

archive_bookmark / unarchive_bookmark

Organize bookmarks by archiving them for later reference.

Parameters

Parameter Type Required Description
bookmark_id integer The bookmark ID

Examples

Archive Bookmark

# Archive a bookmark
archive_bookmark(bookmark_id=123)

# Archive with workflow
bookmark = get_bookmark(bookmark_id=123)
if bookmark['unread'] == False:  # Only archive if read
    archive_bookmark(bookmark_id=123)

Unarchive Bookmark

# Bring bookmark back to active collection
unarchive_bookmark(bookmark_id=123)

Archive Workflows

Batch Archive Old Bookmarks

# Find old bookmarks to archive
old_bookmarks = search_bookmarks(
    query="",
    archived=False,
    limit=100
)

for bookmark in old_bookmarks:
    # Archive if older than 6 months and read
    if not bookmark['unread']:
        archive_bookmark(bookmark_id=bookmark['id'])

Seasonal Archive

# Archive bookmarks with specific tags
tutorial_bookmarks = search_bookmarks(tag="old-tutorial")
for bookmark in tutorial_bookmarks:
    archive_bookmark(bookmark_id=bookmark['id'])

check_url

Check if a URL is already bookmarked and get metadata.

Parameters

Parameter Type Required Description
url string The URL to check

Examples

# Check if URL is already bookmarked
result = check_url(url="https://python.org")

if result['is_bookmarked']:
    print(f"Already bookmarked: {result['bookmark']['title']}")
else:
    print("Not bookmarked yet")
    print(f"Suggested title: {result['metadata']['title']}")

Response Format

{
  "is_bookmarked": true,
  "bookmark": {
    "id": 123,
    "title": "Python.org",
    "url": "https://python.org",
    "tag_names": ["python", "documentation"]
  },
  "metadata": {
    "title": "Welcome to Python.org",
    "description": "The official home of the Python Programming Language",
    "auto_tags": ["programming", "python"]
  }
}

Use Cases

Prevent Duplicates

def smart_add_bookmark(url, **kwargs):
    result = check_url(url=url)

    if result['is_bookmarked']:
        print(f"URL already bookmarked: {result['bookmark']['title']}")
        return result['bookmark']
    else:
        # Use scraped metadata if not provided
        if 'title' not in kwargs and result['metadata']['title']:
            kwargs['title'] = result['metadata']['title']
        if 'description' not in kwargs and result['metadata']['description']:
            kwargs['description'] = result['metadata']['description']

        return add_bookmark(url=url, **kwargs)

Bulk Import with Deduplication

urls_to_import = [
    "https://python.org",
    "https://fastapi.tiangolo.com",
    "https://react.dev"
]

for url in urls_to_import:
    result = check_url(url=url)
    if not result['is_bookmarked']:
        add_bookmark(
            url=url,
            title=result['metadata']['title'],
            description=result['metadata']['description']
        )
    else:
        print(f"Skipping duplicate: {url}")

Common Workflows

Research Session Workflow

def research_workflow(urls, topic_tag):
    """Add multiple research URLs with consistent tagging"""
    added_bookmarks = []

    for url in urls:
        # Check if already exists
        result = check_url(url=url)

        if not result['is_bookmarked']:
            bookmark = add_bookmark(
                url=url,
                title=result['metadata']['title'],
                tags=[topic_tag, "research", "to-read"],
                unread=True,
                notes=f"Added during {topic_tag} research session"
            )
            added_bookmarks.append(bookmark)
        else:
            # Update existing bookmark with research tag
            existing = result['bookmark']
            current_tags = existing['tag_names']
            if topic_tag not in current_tags:
                current_tags.append(topic_tag)
                update_bookmark(
                    bookmark_id=existing['id'],
                    tags=current_tags
                )

    return added_bookmarks

Reading List Management

def manage_reading_list():
    """Process unread bookmarks"""
    unread = search_bookmarks(unread_only=True, limit=20)

    for bookmark in unread:
        print(f"Title: {bookmark['title']}")
        print(f"URL: {bookmark['url']}")

        action = input("(r)ead, (a)rchive, (d)elete, (s)kip: ")

        if action == 'r':
            update_bookmark(
                bookmark_id=bookmark['id'],
                unread=False,
                notes="Read and processed"
            )
        elif action == 'a':
            archive_bookmark(bookmark_id=bookmark['id'])
        elif action == 'd':
            delete_bookmark(bookmark_id=bookmark['id'])

Bookmark Cleanup

def cleanup_bookmarks():
    """Clean up and organize bookmarks"""

    # Find bookmarks without tags
    all_bookmarks = search_bookmarks(query="", limit=100)
    untagged = [b for b in all_bookmarks if not b['tag_names']]

    for bookmark in untagged:
        print(f"Untagged: {bookmark['title']}")
        tags = input("Enter tags (comma-separated): ").split(',')
        tags = [tag.strip() for tag in tags if tag.strip()]

        if tags:
            update_bookmark(
                bookmark_id=bookmark['id'],
                tags=tags
            )

Error Handling

Common Errors

try:
    bookmark = get_bookmark(bookmark_id=999)
except Exception as e:
    if "not found" in str(e):
        print("Bookmark doesn't exist")
    else:
        print(f"Error: {e}")

try:
    add_bookmark(url="invalid-url")
except Exception as e:
    if "Invalid URL" in str(e):
        print("Please provide a valid URL")
    else:
        print(f"Error: {e}")

Validation

def safe_add_bookmark(url, **kwargs):
    """Add bookmark with validation"""

    # Validate URL format
    if not url.startswith(('http://', 'https://')):
        return {"error": "URL must start with http:// or https://"}

    # Check for duplicates
    result = check_url(url=url)
    if result['is_bookmarked']:
        return {"error": "URL already bookmarked", "existing": result['bookmark']}

    # Add bookmark
    try:
        return add_bookmark(url=url, **kwargs)
    except Exception as e:
        return {"error": str(e)}

Next Steps