local-pinboard-mcp
A local-only, secure MCP server to connect your AI assistant to your Pinboard bookmarks
Local Pinboard MCP Server
A locally-hosted Model Context Protocol server that connects your Pinboard account to any MCP-compatible AI assistant (such as Claude Desktop, Cursor, or similar tools).
This integration uses the Pinboard API (v1) with strictly typed TypeScript/Zod schemas to allow your AI assistant to manage your bookmarks, tags, and notes — without exposing credentials externally or relying on third-party services.
You can use the packaged MCPB file to get up and running quickly, or clone the repository to build your own. The source code is open, local, and auditable.
Capabilities
Once connected, your AI assistant can use the following tools:
get_recent_posts
List your most recent Pinboard bookmarks, optionally filtered by up to three tags.
| Parameter | Type | Description |
|---|---|---|
tag | string[]? | Filter by up to 3 tags |
count | number? | Number of results to return (default 15, max 100) |
get_posts
Retrieve bookmarks matching a tag, a specific date, or a specific URL.
| Parameter | Type | Description |
|---|---|---|
tag | string[]? | Filter by up to 3 tags |
dt | string? | Return posts added on this date (YYYY-MM-DD) |
url | string? | Return the post for this exact URL |
meta | boolean? | Include change-detection metadata hash |
get_all_posts
Retrieve all bookmarks in your Pinboard account. Rate limited to once every 5 minutes.
| Parameter | Type | Description |
|---|---|---|
tag | string[]? | Filter by up to 3 tags |
start | number? | Offset for pagination |
results | number? | Maximum number of posts to return |
fromdt | string? | Return only posts created after this datetime (UTC) |
todt | string? | Return only posts created before this datetime (UTC) |
add_post
Add or replace a bookmark. URL and title are required. By default, replaces any existing bookmark for the same URL.
| Parameter | Type | Description |
|---|---|---|
url | string | The URL to bookmark (required) |
title | string | Title of the bookmark (required) |
description | string? | Extended notes or description |
tags | string[]? | Tags to apply. Tags beginning with . are private |
shared | boolean? | Set to false to make the bookmark private |
toread | boolean? | Set to true to mark as unread/to-read |
replace | boolean? | Set to false to skip if bookmark already exists |
dt | string? | Creation timestamp in UTC ISO 8601 format |
delete_post
Permanently delete a bookmark by its URL. This action cannot be undone.
| Parameter | Type | Description |
|---|---|---|
url | string | The URL of the bookmark to permanently delete |
suggest_tags
Return popular (site-wide) and recommended (your history) tags for a given URL.
| Parameter | Type | Description |
|---|---|---|
url | string | The URL to get tag suggestions for |
get_tags
Get all of your Pinboard tags with their usage counts. No parameters.
rename_tag
Rename a tag across all bookmarks, or fold it into an existing tag.
| Parameter | Type | Description |
|---|---|---|
old_name | string | The current tag name |
new_name | string | The new tag name |
delete_tag
Delete a single tag from your account. Removes the tag from all bookmarks but does not delete them.
| Parameter | Type | Description |
|---|---|---|
tag | string | The tag name to delete |
list_notes
List all of your notes (without body text). No parameters. Note creation/editing is unsupported in v1 API.
get_note
Fetch a specific note including its full body text.
| Parameter | Type | Description |
|---|---|---|
id | string | The hex ID of the note |
get_last_update
Returns the time of the most recent bookmark change. Use this to check if data has changed since your last fetch. No parameters.
Security Approach
This server uses stdio transport exclusively — it never exposes an external HTTP port. Communication is strictly between your local machine and the official api.pinboard.in endpoints.
Your API token is passed to Pinboard via the auth_token query parameter as required by the v1 API. To ensure absolute privacy, the server is designed to intercept and sanitize network-level error messages to prevent your token from accidentally leaking into your local Claude Desktop or Cursor logs if a network failure occurs.
Error responses are truncated safely, and input paths like tags and hex IDs are strictly verified via Zod regex before requests are made.
Installation & Setup
0. Download the most recent MCPB file
Drag the .mcpb file from your downloads folder on to your AI assistant's desktop or file browser. The assistant should recognize it as an MCP server and prompt you to load it.
Or...
1. Requirements
Ensure you have installed Node.js (version 22+ recommended) and npm on your local machine.
2. Get your Pinboard API Token
- Log into your Pinboard account.
- Go to Settings → Password.
- Your API token is displayed on that page in the format
username:HEXTOKEN. - Copy it securely.
3. Local Project Setup
Clone the repository and install the required dependencies:
npm install
Copy the example environment variables file:
cp .env.example .env
Open .env in your text editor and paste in your API token:
PINBOARD_API_TOKEN=username:YOURHEXTOKEN
4. Build the Project
Compile TypeScript to JavaScript:
npm run build
Connecting to an MCP Client
This server works with any MCP-compatible client. Below is an example using Claude Desktop.
Claude Desktop
-
Open Claude Desktop and choose Settings → Developer → Edit Config to open
claude_desktop_config.json. -
Add this to the
mcpServerssection, fixing the path to the compiledindex.jsfile and adding your own API token:
{
"mcpServers": {
"local-pinboard": {
"command": "node",
"args": ["/absolute/path/to/your/local-pinboard-mcp/dist/index.js"],
"env": {
"PINBOARD_API_TOKEN": "username:YOURHEXTOKEN"
}
}
}
}
- Restart Claude Desktop. The new tools will appear instantly and you can start asking things like "Show me my recent unread bookmarks" or "Search my bookmarks for React tutorials".
For other MCP clients, consult their documentation on how to register a local stdio server pointing at dist/index.js with the required environment variables.
Development & Testing
This project is built using TypeScript, @modelcontextprotocol/sdk, and Zod parsing.
If you are developing new tools or making adjustments:
- Compile: Always ensure you run
npm run buildafter making modifications. - Testing: Run the Vitest test suite:
npm test
Pull requests are welcome! Please open an issue first to discuss what you'd like to change.
Related Servers
Flutterwave
Interact with the Flutterwave API to manage transactions, generate payment links, and handle customer support.
dRPC Agent Skills
Blockchain RPC via DRPC. Exposes eth_call, eth_getBalance, gas estimation, and other JSON-RPC methods as MCP tools across 100+ blockchains
ENS MCP Server
Interact with the Ethereum Name Service (ENS) to resolve names, check availability, and retrieve records.
Free Crypto News
Free crypto news API + MCP - real-time aggregator for Bitcoin, Ethereum, DeFi, Solana & altcoins. No API key required. RSS/Atom feeds, JSON REST API, historical archive with market context, embeddable widgets, ChatGPT plugin, Claude MCP server, SDKs (Python, TypeScript, Go, React, PHP). AI/LLM ready. Vibe coding friendly. Open source.
Red Bee MCP Server
An MCP server for the Red Bee Media OTT Platform, offering tools for authentication, content search, user management, purchases, and system operations.
Google Analytics MCP Server
A structured interface for interacting with Google Analytics APIs, simplifying tasks like querying reports and managing properties.
Pulse
Open compute-pricing reference — daily GPU and inference-token medians, free under CC-BY 4.0.
AverbePorto-MCP
Integrates with the AverbePorto platform for authentication and document submission using AI tools.
MCP Remote with Okta/Adobe IMS Authentication
A remote MCP server that uses Adobe IMS/Okta for authentication.
Cloudflare MCP Server Template
A template for deploying a remote, authentication-free MCP server on Cloudflare Workers. Tools are defined directly in the source code.