Skip to content
NeuralRepo
Get Support

MCP Server for Claude

NeuralRepo exposes a remote MCP server that gives Claude direct access to your idea repository. Save, search, update, link, and delete ideas without ever leaving your conversation.

The Model Context Protocol is an open standard for connecting AI assistants to external tools and data. NeuralRepo implements an MCP server at:

https://neuralrepo.com/mcp/

When connected, Claude gains nine tools for managing your ideas: eight named tools plus code_mode, which reaches the rest of the API. Authorization is handled through OAuth 2.0 with PKCE, so your data stays secure.

  1. Open Claude.ai and go to Settings ▸ Connectors.

  2. Click Add custom connector.

  3. Paste the NeuralRepo MCP URL:

    https://neuralrepo.com/mcp/
  4. Save. On your next conversation, Claude will have access to NeuralRepo tools.

  5. The first time Claude uses a tool, you will be prompted to authorize via OAuth. Sign in with your NeuralRepo account to grant access.

The same connector works in Claude Desktop and the Claude mobile apps once it is added to your account.

NeuralRepo uses OAuth 2.0 with PKCE (S256) for MCP authorization:

  1. Claude attempts to call a NeuralRepo tool.
  2. The MCP client registers itself if it has not already — NeuralRepo supports Dynamic Client Registration at /mcp/register, and a registration is kept for 30 days.
  3. The MCP client initiates an authorization request with a PKCE code challenge.
  4. You are redirected to the NeuralRepo consent screen where you sign in (GitHub, Google, Apple, or magic link).
  5. You grant Claude the requested scopes: ideas:read and ideas:write.
  6. NeuralRepo issues an access token and a refresh token.
  7. The MCP client stores the tokens and refreshes as needed.
CredentialLifetime
Authorization code10 minutes, single use
Access token30 days
Refresh token90 days, replaced on every refresh
Client registration30 days

Scopes are enforced per tool. save_idea, update_idea, delete_idea, link_ideas, unlink_ideas, and code_mode all require ideas:write; everything else needs ideas:read.

Create a new idea in your repository. Ideas saved this way carry source: "claude-mcp".

ParameterTypeRequiredDescription
titlestringYesIdea title (max 200 chars)
bodystringNoFull description in markdown (max 50,000 chars)
tagsstring[]NoTags to apply (max 20, each max 50 chars)
source_urlstringNoURL where the idea originated (max 2,000 chars)
statusstringNocaptured, exploring, building, shipped, shelved
parent_idnumberNoParent idea id for sub-ideas — must exist, or the call fails
{
"saved": true,
"idea": {
"id": 138,
"number": 42,
"title": "Browser extension for idea capture",
"body": null,
"status": "captured",
"source": "claude-mcp",
"source_url": null,
"parent_id": null,
"vectorize_id": null,
"is_archived": 0,
"created_at": "2026-03-24 10:30:00",
"updated_at": "2026-03-24 10:30:00",
"tags": ["chrome", "extension"]
}
}

Embedding, duplicate detection, and auto-tagging run asynchronously after the tool returns, so vectorize_id is null in the response and any auto-applied tags land seconds later.

Modify an existing idea, or change status and tags on up to 50 ideas at once.

ParameterTypeRequiredDescription
idnumberYes (single mode)Idea id to update. Mutually exclusive with ids.
idsnumber[]Yes (bulk mode)Up to 50 idea ids. Mutually exclusive with id.
titlestringNoNew title — single mode only
bodystringNoNew body — single mode only
statusstringNoNew status
tagsstring[]NoReplace all tags
add_tagsstring[]NoAppend tags without removing existing
remove_tagsstring[]NoRemove specific tags
link_toobjectNoCreate a relation to another idea in the same call — single mode only. Sub-fields: idea_id (number, required), relation_type (string, required — one of related, blocks, inspires, parent, supersedes), note (string, optional).

tags cannot be combined with add_tags or remove_tags. Bulk mode rejects title, body, and link_to, and requires at least one of status or a tag operation.

Single mode returns the updated idea, plus relation_created when link_to was used:

{
"updated": true,
"idea": { "id": 138, "number": 42, "status": "building", "tags": ["chrome"] },
"relation_created": { "id": 17, "relation_type": "related", "target_idea_id": 96 }
}

Bulk mode is not atomic — it reports per-idea outcomes and keeps going after a failure:

{
"updated": 2,
"errors": 1,
"results": [
{ "id": 137, "status": "updated" },
{ "id": 138, "status": "updated" },
{ "id": 96, "status": "error", "error": "Idea 96 not found" }
]
}

Archive an idea. The row survives with is_archived = 1, and its vector is deleted from the search index.

ParameterTypeRequiredDescription
idnumberYesIdea id to archive
{ "deleted": true, "id": 138, "title": "Browser extension for idea capture" }

Search your ideas by meaning, or browse them by recency.

ParameterTypeRequiredDescription
querystringNoSearch query, max 500 chars. Omit to browse/list.
statusstringNoFilter by status
tagstringNoFilter by tag name
limitnumberNoMax results (max 100). Default 5 with a query; see below without one.
offsetnumberNoResults to skip (browse mode)

With a query (search mode) — semantic search over your embeddings, reranked, with everything below your score threshold dropped:

{
"query": "browser extension",
"ideas": [
{ "id": 138, "number": 42, "title": "Browser extension for idea capture", "status": "captured", "tags": ["chrome"], "score": 0.92 }
],
"search_type": "semantic"
}

search_type tells you which path answered:

ValueMeaning
semanticVector search returned matches above the threshold
fts_fallbackSemantic search returned nothing or errored, so keyword search answered — or a Free account has spent its 10 semantic searches for the month, in which case a notice field explains that
browseNo query was given

Without a query (browse mode) — and this is the surprising one: with no limit and no offset, the tool auto-paginates and returns every idea you have, in pages of 100:

{
"ideas": [ { "id": 138, "number": 42, "title": "Browser extension for idea capture", "status": "captured", "tags": ["chrome"] } ],
"count": 1,
"search_type": "browse"
}

Pass an explicit limit (or a non-zero offset) to get one page instead. That response adds offset, limit, and has_more, and its count is the total matching your filters, not the number of rows returned.

Filtering by a tag that does not exist is not an error — you get an empty list and a hint:

{ "ideas": [], "count": 0, "hint": "Tag \"chorme\" does not exist. Use list_tags to see available tags." }

Retrieve a single idea with full details.

ParameterTypeRequiredDescription
idnumberYesIdea id
include_contextbooleanNoInclude related ideas, links, and duplicate detections (default false)

Without include_context you get the idea row plus tags, links, and relations. With it, the tool returns two content blocks: a Markdown project-context brief Claude can read directly, and the same data as JSON. Related ideas are deduplicated, so an idea reachable by two relation types appears once with a relation_types array.

Returns all tags in your repository with idea counts. No parameters.

{
"tags": [
{ "name": "chrome", "color": "#4285f4", "idea_count": 3 },
{ "name": "mobile", "color": null, "idea_count": 7 }
],
"count": 2
}

Create typed relations between ideas, one at a time or up to 50 in a batch.

ParameterTypeRequiredDescription
source_idea_idnumberYes (single mode)Source idea id
target_idea_idnumberYes (single mode)Target idea id
relation_typestringNorelated, parent, blocks, inspires, supersedes (default related)
notestringNoExplanation of the relationship (max 500 chars)
linksobject[]Yes (bulk mode)Up to 50 link objects with the same fields. Mutually exclusive with source_idea_id/target_idea_id.

parent reads source is a child of target, so linking 138 → 96 as parent makes 96 the parent. Cycles are refused outright for blocks and parent; supersedes cycles are allowed. Bulk mode returns { linked, errors, results } with a per-link outcome, so one bad pair does not kill the batch.

Remove a relation between ideas. Use get_idea with include_context: true to find relation IDs first.

ParameterTypeRequiredDescription
relation_idnumberYesRelation ID to remove

The response is { "unlinked": true, "relation_id": 17 } whether or not a relation with that ID existed — a no-op and a real deletion look identical.

Execute multi-step operations against the NeuralRepo API in a single call. Useful for workflows that combine search, filter, update, and link operations, or for accessing capabilities not exposed as discrete tools (merge ideas, manage duplicates, CRUD tags, attach URL links, get stats, develop specs, update relations).

ParameterTypeRequiredDescription
codestringYesAsync JavaScript function body, max 10,000 characters. Calls snake_case functions on the neuralrepo object (e.g., neuralrepo.search_ideas(), neuralrepo.update_idea()).

The code runs in a sandboxed Worker with your user and plan applied, so plan gates and free-tier limits behave exactly as they do through the named tools.

  • Ask Claude to tag ideas as it saves them — “save this idea and tag it with mobile and mvp.”
  • Use update_idea in bulk mode to retag or move a batch: “move all my browser extension ideas to exploring.”
  • Use include_context: true on get_idea to see the full network around an idea.
  • Ask for the id when you plan to use an idea elsewhere — the #42 Claude quotes back may be the display number.
IssueSolution
OAuth prompt keeps appearingRevoke the client in Settings ▸ Connections ▸ Connected MCP Clients (Pro) and re-authorize from scratch.
Connection timeoutVerify your network allows outbound HTTPS to neuralrepo.com. Corporate firewalls may block MCP transport.
”Not authorized” errorYour refresh token may have expired (90-day limit) or been revoked. Re-authorize via the OAuth flow.
”Insufficient scope”The token was issued without ideas:write. Re-authorize and grant both scopes.
Tool not appearing in ClaudeEnsure the MCP server is correctly configured. In Claude Code, run claude mcp list to verify.
Linking fails with “requires a Pro plan”link_ideas and unlink_ideas are Pro-only. Every other tool works on Free.
”Idea N not found” for an idea you can seeYou passed the display #number instead of the database id.
Rate limitedMCP requests count toward your daily API limit (100/day Free, 10,000/day Pro). Wait and retry.