Claude Connector (MCP v2)
The NeuralRepo Claude connector is the MCP server at https://neuralrepo.com/mcp/v2. Enter
that URL exactly, without a trailing slash. It gives Claude 21 separate tools for your ideas:
7 that only read, 4 that add something, and 10 that change or remove something. Each tool says
which kind it is, so Claude can ask before it changes anything.
https://neuralrepo.com/mcp/v2Which endpoint should I use, v2 or v1?
Section titled “Which endpoint should I use, v2 or v1?”Use v2 unless you depend on code_mode. The two endpoints run side by side, share the same
OAuth sign-in and tokens, and work on the same library.
/mcp/v2 (this page) | /mcp/ (v1) | |
|---|---|---|
| URL to enter | https://neuralrepo.com/mcp/v2 | https://neuralrepo.com/mcp/ |
| Tools | 21 discrete tools, each with a title, read-only/destructive hints and an output schema | 8 named tools plus code_mode |
code_mode (sandboxed JavaScript against the API) | No | Yes, only here |
| Archive and restore | archive_idea, and restore_idea brings an idea back | delete_idea archives, no restore tool |
| Merging, duplicates, tag clean-up, attached links, stats | Each is its own tool | Only through code_mode |
| Listed in the Claude connector directory | Yes, this is the endpoint submitted | No |
The v1 endpoint is unchanged and keeps working. Its reference is at MCP Server for Claude.
How do I connect it?
Section titled “How do I connect it?”-
Open claude.ai and go to Settings ▸ Connectors.
-
Click Add custom connector.
-
Enter the URL, with no slash at the end:
https://neuralrepo.com/mcp/v2 -
Connect. You are sent to NeuralRepo to sign in (GitHub, Google, Apple or a magic link) and approve access. The consent page shows the host Claude will return you to.
Add the connector once on claude.ai (see the first tab). Connectors belong to your Claude account, so the same connector then appears in Claude Desktop and the Claude mobile apps without setting it up again.
Run:
claude mcp add --transport http neuralrepo https://neuralrepo.com/mcp/v2Claude Code opens the NeuralRepo sign-in the first time it needs the server. If you already
added the v1 endpoint under the name neuralrepo, remove it first (claude mcp remove neuralrepo) or give this one another name.
Why no trailing slash?
Section titled “Why no trailing slash?”Claude checks that the server’s OAuth protected-resource document names exactly the URL you
entered. NeuralRepo publishes that document for v2 at
https://neuralrepo.com/.well-known/oauth-protected-resource/mcp/v2, and its resource value is
https://neuralrepo.com/mcp/v2, with no slash. The server answers on both /mcp/v2 and
/mcp/v2/, but only the no-slash form matches, so https://neuralrepo.com/mcp/v2/ can fail at
sign-in.
How does sign-in work?
Section titled “How does sign-in work?”The connector uses the same OAuth server as v1: Dynamic Client Registration at /mcp/register,
PKCE with S256 required, and two scopes, ideas:read and ideas:write. Token
lifetimes, revoking a connection, and the PKCE errors are described under
OAuth Flow on the v1 page; they apply to v2 unchanged.
Scopes map to tools like this:
- The 7 read-only tools need
ideas:readorideas:write. - Every other tool needs
ideas:write. With a read-only connection it returns: “This connection has read-only access (ideas:read). Reconnect NeuralRepo with write access to make changes.”
What can each plan do?
Section titled “What can each plan do?”Every tool is available on both plans, but some return less on Free.
| Limit | Free | Pro |
|---|---|---|
| Active (unarchived) ideas | 50. save_idea and restore_idea refuse at the cap. | Unlimited |
Semantic search in search_ideas | 10 per calendar month, then keyword matching with a notice | Unlimited |
link_ideas, unlink_ideas | Refused: “Linking ideas is a Pro-plan feature…” | Yes |
list_duplicates | Empty list with a notice | Yes |
resolve_duplicate | Refused: “Duplicate detection is a Pro-plan feature, so nothing was changed.” | Yes |
get_idea duplicates section | Always an empty list | Pending duplicates |
get_stats pending_duplicates | null | A count |
At the Free cap, save_idea returns an error: “This library has reached the free plan’s limit of
50 active ideas, so the idea was not saved. Archiving an idea makes room for a new one.” The
monthly semantic-search allowance is one counter per account, shared with the v1 endpoint and
the REST API’s semantic search.
merge_ideas, add_link, remove_link and the tag tools have no plan check.
What do the tools return?
Section titled “What do the tools return?”Each tool returns structuredContent that matches the outputSchema it publishes in
tools/list, plus the same JSON as one text block.
When a tool fails, the result has isError: true and a sentence Claude can act on, for
example:
No idea with id 999 in this library.Invalid arguments for update_idea: status: …(the input failed validation)The result is too large (… characters). Ask for fewer items: lower the limit or narrow the filters.(results over 100,000 characters)
Every tool that takes an idea takes its database id, not the #number shown in the app.
Results carry both: id and number. See
Idea identifiers.
Read-only tools
Section titled “Read-only tools”These seven tools never change anything (readOnlyHint: true).
search_ideas
Section titled “search_ideas”Finds ideas by meaning with a query, or lists them newest first without one.
| Parameter | Type | Required | Notes |
|---|---|---|---|
query | string | No | 1–500 characters. Omit to browse. |
status | string | No | captured, exploring, building, shipped, shelved |
tag | string | No | Only ideas with this tag (max 50 characters) |
source | string | No | web, cli, claude-mcp, siri, email, api, shortcut, ios |
created_after | string | No | ISO date (2026-10-01) or date-time; inclusive |
created_before | string | No | ISO date or date-time; exclusive |
limit | integer | No | 1–50, default 20 |
cursor | string | No | next_cursor from the previous page. Browsing only. |
Returns search_type (browse, semantic or keyword), ideas (each with id, number,
title, status, source, tags, a 280-character body_preview, dates, and score for semantic
results), total (browsing only; null with a query) and next_cursor. A query returns one page;
passing cursor with a query is an error. If semantic search finds nothing above your score
threshold, or fails, the tool answers with keyword matches.
get_idea
Section titled “get_idea”Returns one idea with its full body.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | integer | Yes | Idea id |
include | string[] | No | Any of relations, links, duplicates. Default all three; [] for the idea alone. |
Relations come with a relation_id (for unlink_ideas) and a direction; links come with an id
(for remove_link); duplicates come with a detection_id (for resolve_duplicate). get_idea
also finds archived ideas by id, with archived: true.
get_idea_context
Section titled “get_idea_context”Returns one idea with its full body plus its closest related ideas and attached links in one compact result. Meant for planning or writing a spec around an idea.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | integer | Yes | Idea id |
max_related | integer | No | 0–10, default 5 |
Each related idea appears once, with all its relation_types merged, a score and a
body_preview.
list_tags
Section titled “list_tags”Lists your tags with how many active ideas use each.
| Parameter | Type | Required | Notes |
|---|---|---|---|
sort | string | No | count (most used first, default) or name |
min_count | integer | No | Default 1, so unused tags are left out. Pass 0 to include them. |
limit | integer | No | 1–200, default 50 |
cursor | string | No | next_cursor from the previous page |
find_similar_tags
Section titled “find_similar_tags”Finds tags that look like variants of one tag: the same word spelled differently (“Mind Map”, “mind-maps”) and tags with a close meaning.
| Parameter | Type | Required | Notes |
|---|---|---|---|
tag | string | Yes | An existing tag name |
limit | integer | No | 1–20, default 5 |
Each match has match: "spelling" or "meaning", an idea_count, and a similarity (null for
spelling matches). If the tag has no meaning index yet, only spelling variants come back, with a
notice.
get_stats
Section titled “get_stats”Counts for your library. No parameters.
Returns total (active ideas), by_status, recent_7d (ideas created in the last 7 days),
pending_duplicates (null on Free) and top_tags (up to 10).
list_duplicates
Section titled “list_duplicates”Lists ideas detected as likely duplicates, grouped so that ideas duplicating each other sit
together, best match first. Pro; Free gets an empty list and a notice.
| Parameter | Type | Required | Notes |
|---|---|---|---|
limit | integer | No | Groups to return, 1–50, default 20 |
Each group has its ideas, its pairs (each with a detection_id, idea_id, duplicate_of_id
and similarity) and max_similarity. Detection runs in the background after an idea is saved;
see Duplicate Detection.
Write tools that add
Section titled “Write tools that add”These four tools add or bring back data and destroy nothing (destructiveHint: false).
save_idea
Section titled “save_idea”Saves a new idea. Ideas saved this way have source: "claude-mcp".
| Parameter | Type | Required | Notes |
|---|---|---|---|
title | string | Yes | 1–200 characters |
body | string | No | Markdown, max 50,000 characters |
tags | string[] | No | Max 20. "a, b" is split into two tags. Stored lowercase with spaces as hyphens. |
status | string | No | Default captured |
source_url | string | No | http or https URL, max 2,000 characters |
parent_id | integer | No | Make it a sub-idea of this idea id; must exist |
Returns the saved idea. Embedding, duplicate detection and auto-tagging run
in the background afterwards, so any duplicate shows
up later in list_duplicates, not in this result. Free accounts are refused at 50 active ideas.
link_ideas
Section titled “link_ideas”Records a relationship between two ideas. Pro.
| Parameter | Type | Required | Notes |
|---|---|---|---|
source_idea_id | integer | Yes | |
target_idea_id | integer | Yes | Must differ from the source |
relation_type | string | No | related (default), parent, blocks, inspires, supersedes |
note | string | No | Max 500 characters |
A parent or blocks link that would close a loop is refused, naming the loop. Linking the same
pair again is refused; remove the old link with unlink_ideas first.
add_link
Section titled “add_link”Attaches a web address to an idea.
| Parameter | Type | Required | Notes |
|---|---|---|---|
idea_id | integer | Yes | |
url | string | Yes | http or https, max 2,000 characters |
title | string | No | Max 200 characters |
link_type | string | No | url (default), claude-chat, github-repo, github-issue |
restore_idea
Section titled “restore_idea”Brings an archived idea back into searches and lists, and queues it to be re-indexed for semantic search.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | integer | Yes | Idea id. get_idea finds archived ideas by id. |
Restoring an idea that isn’t archived changes nothing and succeeds. On Free, restoring is refused while the library holds 50 active ideas.
Write tools that change or remove
Section titled “Write tools that change or remove”These ten tools overwrite or delete something (destructiveHint: true). Claude may ask you to
confirm before calling them.
update_idea
Section titled “update_idea”Changes one idea’s title, body, status or tags.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | integer | Yes | |
title | string | No | 1–200 characters |
body | string | No | Replaces the whole body; max 50,000 characters |
status | string | No | |
tags | string[] | No | Replaces every tag |
add_tags | string[] | No | Adds tags |
remove_tags | string[] | No | Removes tags |
Give at least one change. tags can’t be combined with add_tags or remove_tags, and an idea
can hold at most 20 tags. Returns the idea and a changes object listing only the fields whose
value changed (from/to, or added/removed for tags).
update_ideas
Section titled “update_ideas”Sets the status and/or adds or removes tags on up to 50 ideas at once. Titles and bodies are not changed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
ids | integer[] | Yes | 1–50 idea ids |
status | string | No | |
add_tags | string[] | No | |
remove_tags | string[] | No |
Not all-or-nothing: each idea succeeds or fails on its own. The result is
{ updated, errors, results }, with one entry per idea, so check errors rather than assuming the
whole batch applied.
archive_idea
Section titled “archive_idea”Archives an idea: it leaves searches, lists and counts, its search vector is removed, and the idea
itself is kept. restore_idea brings it back.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | integer | Yes |
On Free, archiving frees a slot under the 50-idea cap.
unlink_ideas
Section titled “unlink_ideas”Deletes one relationship between two ideas. Pro.
| Parameter | Type | Required | Notes |
|---|---|---|---|
relation_id | integer | Yes | From the relations in get_idea |
An id that doesn’t exist returns an error (No relation with id … in this library.).
remove_link
Section titled “remove_link”Deletes one web address attached to an idea.
| Parameter | Type | Required | Notes |
|---|---|---|---|
idea_id | integer | Yes | |
link_id | integer | Yes | From the links in get_idea |
resolve_duplicate
Section titled “resolve_duplicate”Resolves one detected duplicate pair. Pro.
| Parameter | Type | Required | Notes |
|---|---|---|---|
detection_id | integer | Yes | From list_duplicates or get_idea |
action | string | Yes | dismiss (not duplicates; stop suggesting the pair) or merge |
keep_id | integer | No | merge only. Which of the pair to keep; default the pair’s idea_id, the idea captured later. |
merged_body | string or null | No | merge only. See merge_ideas. |
A merge works exactly like merge_ideas. A detection that is no longer pending is refused.
merge_ideas
Section titled “merge_ideas”Merges one idea into another. Available on both plans.
| Parameter | Type | Required | Notes |
|---|---|---|---|
keep_id | integer | Yes | The idea to keep |
absorb_id | integer | Yes | The idea to absorb and archive |
merged_body | string or null | No | The combined body. Omit to append the absorbed body under a “Merged from #N” heading; null leaves the kept idea with no body. |
The kept idea gets the merged body, the absorbed idea’s tags, links and relations, and the earlier
of the two creation dates. The absorbed idea is archived, not deleted, so restore_idea can
bring it back. Restoring does not undo the merge: the kept idea keeps the merged body and
everything moved to it. Both ideas must be active; merging an archived idea is refused.
rename_tag
Section titled “rename_tag”Renames a tag on every idea that has it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
tag | string | Yes | The current name |
new_name | string | Yes | One tag name, stored lowercase with spaces as hyphens |
If another tag already has the new name, the call is refused; use merge_tags instead.
merge_tags
Section titled “merge_tags”Folds several tags into one: every idea with any of them gets the into tag, and the folded tags
are removed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
tags | string[] | Yes | 1–20 tag names to fold in |
into | string | Yes | The tag to keep; created if it doesn’t exist |
If any named tag doesn’t exist, nothing is merged.
delete_tag
Section titled “delete_tag”Deletes a tag and removes it from every idea. The ideas are kept. This cannot be undone.
| Parameter | Type | Required | Notes |
|---|---|---|---|
tag | string | Yes |