compy-mcp
The compy-mcp server lets AI agents search, list, and retrieve web highlights, notes, and tasks captured by the Compy Chrome extension from a local JSON file — no network, account, or API keys required. Capabilities include:
search_notes: Ranked keyword search across note text, quotes, titles, and tags, with optional filtering by site or label (up to 200 results).list_tasks: Retrieve all captured notes/tasks, optionally filtered by site or label (up to 500 results).list_sites: Discover all sites where notes have been taken, with note counts per site.get_note: Fetch a single note by its ID.get_markdown: Render notes as a formatted Markdown task list, optionally scoped to a specific site.compy://sitesresource: A resource overview of all sites with note counts.
All operations are read-only and fully local, reading from a compy-export.json file synced by the extension.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@compy-mcpsearch notes for mentions of pricing"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
compy-mcp
Let your AI agent search and read the notes you captured on the web with Compy.
Compy is a local-first Chrome extension for highlighting and note-taking on any web page. compy-mcp is a Model Context Protocol server that exposes those notes to an MCP client (Claude Code, Claude Desktop, …) so your agent can pull the relevant highlights and tasks on demand — no copy-paste.
100% local. Read-only. No account, no network — it just reads a JSON file that Compy writes on your machine.
How it works
Compy (browser) ──"Sync for AI"──▶ ~/Downloads/compy/compy-export.json
│ (watched)
compy-mcp (stdio)
│ tools + resources
Claude Code / any MCP clientIn Compy's dashboard, open the Copy for AI menu → Sync for AI. This writes
~/Downloads/compy/compy-export.json. Re-run it whenever you want the agent to see your latest notes.Register this server with your MCP client (below).
Ask your agent things like "check Compy for anything I flagged on the billing page" — it calls
search_notesand gets your notes, quotes, tags and URLs.
Related MCP server: Bruin
Install
Requires Node 18+.
Claude Code
claude mcp add compy -- npx -y compy-mcpClaude Desktop / other clients
Add to your MCP config:
{
"mcpServers": {
"compy": { "command": "npx", "args": ["-y", "compy-mcp"] }
}
}Pin a project to one site (optional)
If you work across several sites, bind a project's server to one site with
COMPY_SITE so search_notes / list_tasks default to it (the agent doesn't
have to know which site your notes are on):
claude mcp add compy -e COMPY_SITE=https://app.example.com -- npx -y compy-mcpPass site: "*" in any call to search across all sites anyway. Without
COMPY_SITE, everything is unfiltered by default — the agent searches by
keywords and can call list_sites to discover what's available.
Custom file location
By default it reads ~/Downloads/compy/compy-export.json. Override with an env var or flag:
COMPY_FILE=/path/to/compy-export.json npx compy-mcp
# or
npx compy-mcp --file /path/to/compy-export.jsonTools
Tool | What it does |
| Ranked keyword search over note text, quotes, titles and tags. Filter by |
| List notes/tasks, optionally filtered by |
| Sites you have notes on, with counts. Good first call. |
| Fetch one note by |
| Render notes as a Markdown task list (optionally scoped to a site). |
Resource: compy://sites — overview of sites + counts.
Why keyword search, not embeddings?
The note set is small (tens to a few hundred short notes) and the calling model is the semantic layer — it reasons over what search_notes returns. Fast substring/token ranking is plenty at this scale and keeps everything local, with zero setup and no API keys.
License
MIT
Available Tools
5 toolsget_markdownGet Markdown task listC
Render the notes as a ready-to-read Markdown task list, optionally scoped to one site.
| Name | Required | Description | Default |
|---|---|---|---|
| site | No | Origin or host to scope to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It does not mention if the tool is read-only, modifies data, requires authentication, or what it returns. 'Render' is vague regarding side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is front-loaded with the main action and includes optional scope. No wasted words, but could be slightly more informative without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one optional parameter and no output schema, yet the description omits what 'notes' refers to, how the Markdown is returned, or any limitations. Incomplete for a tool with sparse structured information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline is 3. The description adds only that scoping is optional, which is already implied by the parameter not being required. No additional format or constraint details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renders notes as a Markdown task list with optional site scoping, differentiating from siblings like 'get_note' and 'list_sites', though not explicitly contrasting with 'list_tasks'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus siblings such as 'list_tasks' or 'search_notes'. The description only explains functionality without usage context or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_noteGet one noteA
Fetch a single note/task by its id (as returned by search_notes / list_tasks).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The note id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It only states the basic fetch action, with no disclosure of side effects, error handling, authorization needs, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence efficiently conveys the purpose and context with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter fetch tool with no output schema, the description provides adequate context. It could be enhanced by noting the return format, but it is functionally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds value beyond the schema by specifying the id's source (search_notes/list_tasks), aiding correct selection. Schema coverage is 100%, baseline 3, so this slight addition justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches a single note/task by its id, with a reference to whence the id comes (search_notes/list_tasks), distinguishing it from siblings like get_markdown.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when you have an id from search_notes/list_tasks, but lacks explicit guidance on when to use or avoid it, e.g., versus get_markdown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitesList sitesA
List the sites the user has notes on, with a count each. Good first call to see what's available.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description indicates read-only listing behavior with counts. No mention of side effects or limits, but adequate for a basic tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with action, no wasted words. Efficiently conveys purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, annotations, or output schema, description fully covers purpose and usage hint. Complete for a simple listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; schema coverage is 100%. Description adds no parameter info, but baseline for 0 params is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'List' and resource 'sites' with qualifier 'the user has notes on, with a count each'. Differentiates from siblings like search_notes and get_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes 'Good first call to see what's available', advising when to use it as an initial step. Lacks explicit exclusions but sufficient for a simple tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksList Compy tasksA
List captured notes/tasks, optionally filtered by site or tag. Use when you want the full set rather than a keyword search.
| Name | Required | Description | Default |
|---|---|---|---|
| site | No | Filter by origin or host | |
| label | No | Filter by tag/label | |
| limit | No | Max results (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits. It mentions optional filters but does not explain behavior like default ordering, pagination (limit is mentioned but not explained), or what 'captured' means. Basic transparency, but gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, no redundancy. Information is front-loaded with the core action and optionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters and no output schema, the description is somewhat complete but lacks detail on return format, pagination behavior, and what constitutes 'captured'. Could improve by specifying output structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds little beyond schema, only rephrasing 'site' and 'label' as 'site or tag'. No additional semantic context for parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists captured notes/tasks with optional filtering by site or tag, and distinguishes from sibling 'search_notes' by specifying 'full set' vs keyword search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on when to use ('when you want the full set rather than a keyword search'), effectively differentiating from the sibling tool 'search_notes', though no exclusions or alternatives beyond that are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_notesSearch Compy notesA
Search the highlights, notes and tasks the user captured on the web. Pass keywords from what you're working on to pull the relevant ones. Returns ranked matches with note text, highlighted quote, tag, URL and origin.
| Name | Required | Description | Default |
|---|---|---|---|
| site | No | Limit to one site by origin (https://app.example.com) or host (app.example.com) | |
| label | No | Limit to one tag/label, e.g. Bug, Idea, For AI | |
| limit | No | Max results (default 20) | |
| query | Yes | Keywords or a phrase to match against note text, quotes, titles and tags |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description explains that the tool returns ranked matches and lists the output fields, indicating a read-only operation. It does not disclose potential side effects or limitations, but the search nature implies safe usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences cover what the tool does, how to use it, and what it returns. No unnecessary information; the description is front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides sufficient information to understand the tool's purpose, input parameters, and return structure without needing an output schema. It covers all key aspects for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All four parameters are fully described in the schema (100% coverage). The tool description adds value by explaining how to use the query parameter ('pass keywords from what you're working on') and summarizing return fields, which complements the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches highlights, notes, and tasks captured on the web, and specifies the return fields (note text, quoted, tag, URL, origin). It effectively distinguishes itself from sibling tools like get_markdown or list_sites by focusing on search across these items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises to pass keywords from current work to find relevant notes, providing clear usage context. It does not explicitly state when not to use or list alternatives, but the context and sibling names imply appropriate use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
get_markdown - First observed
get_note - First observed
list_sites - First observed
list_tasks - First observed
search_notes
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose: rendering a markdown list, fetching a single note by ID, listing sites with counts, listing tasks with filters, and searching notes by keywords. No overlap or ambiguity.
All tool names follow a consistent verb_noun pattern using snake_case: get_markdown, get_note, list_sites, list_tasks, search_notes. This pattern is predictable and clear.
With 5 tools covering listing, searching, fetching, and rendering, the count is well-scoped for a read-only note retrieval server. It is neither too few nor too many.
The tool set provides complete coverage for reading and searching notes (list, search, get, render). However, it lacks any write operations (create, update, delete), which may be intentional but represents a gap for full note management.
Maintenance
Related MCP Connectors
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
- TaprootOAuthcom.taproothq
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Related MCP Servers
- AlicenseAqualityDmaintenanceA local-first MCP server that exposes personal notes and files as unified semantic context for AI agents via vector search and file monitoring.6MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for AI agents to read, write, and organize notes in a local-first, human-in-the-loop note-taking app.1 npm2MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that provides semantic memory with search, related-content traversal, and write-back capabilities, all powered by local embeddings of your notes, documents, and chat histories.3MIT
- AlicenseAqualityAmaintenanceMCP server for managing a local, domain-agnostic knowledge base using Markdown notes with frontmatter. Enables AI agents to capture, read, search, link, and maintain notes with atomic writes and privacy controls.13MIT