Server data from the Official MCP Registry
Recommendations, search, catalogue, analytics, and platform admin tools for NeuronSearchLab
Recommendations, search, catalogue, analytics, and platform admin tools for NeuronSearchLab
Remote endpoints: streamable-http: https://console.neuronsearchlab.com/api/mcp
This is a well-structured MCP server for the NeuronSearchLab recommendation platform with comprehensive input validation via Zod schemas and properly scoped authentication. The server implements appropriate guardrails for platform API access and demonstrates good code quality with clear separation of concerns. Minor issues around broad exception handling and the fallback platform API mechanism do not significantly impact security, as the server appropriately validates paths against an allowlist. Supply chain analysis found 3 known vulnerabilities in dependencies (0 critical, 3 high severity). Package verification found 1 issue.
3 files analyzed · 8 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: NSL_CLIENT_ID
Environment variable: NSL_CLIENT_SECRET
Environment variable: NSL_PLATFORM_MODE
Environment variable: NSL_API_KEY
Available as Local & Remote
This plugin can run on your machine or connect to a hosted endpoint. during install.
From the project's GitHub README.
MCP (Model Context Protocol) server for NeuronSearchLab. Gives any MCP-compatible AI client (Claude, Codex, Cursor, Windsurf, etc.) direct access to NeuronSearchLab recommendations, product/content search, catalogue operations, analytics, and platform controls.
"Get 5 recommendations for user alice@example.com"
"Create a new context called Twitter Feed"
"Add a pin rule so Nike items always appear in the top 3"
"Why did item prod-456 rank first for bob?"
Two ways to run it:
https://console.neuronsearchlab.com/api/mcp — Streamable HTTP with OAuth sign-in or an NSL API key. Listed on the MCP Registry as com.neuronsearchlab/mcp.npx -y @neuronsearchlab/mcp in two modes — public (recommendations, events, catalogue via OAuth client credentials) or internal (admin platform via console API key).The hosted endpoint runs the full platform toolset; what a connection can actually do is governed by the scopes of the API key behind it (an admin-scoped key unlocks everything). Keys minted through OAuth consent appear in console → Security and can be revoked there anytime.
claude.ai / Claude Desktop — Settings → Connectors → Add custom connector → paste https://console.neuronsearchlab.com/api/mcp → Connect, then sign in to your NeuronSearchLab console and approve the scopes.
Claude Code
# OAuth (browser sign-in):
claude mcp add --transport http neuronsearchlab https://console.neuronsearchlab.com/api/mcp
# …or with an API key:
claude mcp add --transport http neuronsearchlab https://console.neuronsearchlab.com/api/mcp \
--header "Authorization: Bearer nsl_your_key"
OpenAI Codex — in ~/.codex/config.toml:
[mcp_servers.neuronsearchlab]
url = "https://console.neuronsearchlab.com/api/mcp"
bearer_token_env_var = "NSL_API_KEY"
Cursor / Windsurf / other Streamable HTTP clients
{
"mcpServers": {
"neuronsearchlab": {
"url": "https://console.neuronsearchlab.com/api/mcp",
"headers": { "Authorization": "Bearer nsl_your_key" }
}
}
}
| Tool | Description |
|---|---|
get_recommendations | Fetch personalised recommendations for a user |
get_auto_recommendations | Auto-sectioned feed with pagination (infinite scroll) |
track_event | Record a user interaction (click, view, purchase, etc.) |
upsert_item | Add or update a catalogue item |
patch_item | Partially update an item (enable/disable, change fields) |
delete_items | Permanently remove items from the catalogue |
search_items | Search the catalogue by keyword |
explain_ranking | Explain why an item ranked where it did for a user |
Uses OAuth client credentials and the public API.
Supported:
Uses a NeuronSearchLab API key with the admin scope against the console API.
Currently supported:
search_items, explain_rankinglist_contexts, create_context, update_context, get_contextlist_pipelines, create_pipeline, update_pipeline, delete_pipeline, activate_pipeline, deactivate_pipeline, clone_pipeline, get_pipelinelist_rules, create_rule, update_rule, delete_rule, toggle_rule, enable_rule, disable_rule, get_rulelist_segments, get_segment, create_segment, update_segment, delete_segmentlist_experiments, get_experiment, create_experiment, update_experiment, start_experiment, stop_experiment, get_experiment_resultslist_training_jobs, get_training_job, create_training_job, cancel_training_jobget_ranking_metrics, get_user_analytics, get_item_analytics, compare_items, top_itemslist_event_types, create_event_type, update_event_type, delete_event_typelist_api_keys, create_api_key, revoke_api_key, list_integrationslist_platform_routes, call_platform_apiGenerate SDK Credentials (OAuth 2.0 client ID + secret) from the NeuronSearchLab console.
Public mode (recommendations, events, catalogue):
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"neuronsearchlab": {
"command": "npx",
"args": ["-y", "@neuronsearchlab/mcp"],
"env": {
"NSL_CLIENT_ID": "your-client-id",
"NSL_CLIENT_SECRET": "your-client-secret"
}
}
}
}
Internal mode (admin platform — contexts, pipelines, rules, analytics, etc.):
{
"mcpServers": {
"neuronsearchlab": {
"command": "npx",
"args": ["-y", "@neuronsearchlab/mcp"],
"env": {
"NSL_PLATFORM_MODE": "internal",
"NSL_API_KEY": "your-admin-api-key"
}
}
}
}
Restart Claude Desktop. You'll see a 🔌 neuronsearchlab indicator in the toolbar when it's connected.
Once connected, use this short demo path to prove the server is useful before wiring it into a larger workflow:
request_id when available.Get 10 recommendations for user demo-user@example.com using context homepage-feed
Search the catalogue for waterproof jackets and show the top 5 item ids
Record event type id 1 as a click for item jacket-123 from user demo-user@example.com, using the request_id from the recommendation or search response
Explain why item jacket-123 ranked first for demo-user@example.com
For internal mode, keep the first pass read-only:
List my recommendation contexts
Show the latest ranking metrics
Compare item jacket-123 with item jacket-456
Next steps after the smoke test:
homepage-feedFollow your client's MCP server guide. The command is:
npx @neuronsearchlab/mcp
Set NSL_CLIENT_ID + NSL_CLIENT_SECRET for public mode, or NSL_PLATFORM_MODE=internal + NSL_API_KEY for internal mode.
This repo uses Changesets plus GitHub Actions for automated versioning and npm publishing.
npm run changesetmainrelease.yml workflow opens or updates a version PR@neuronsearchlab/mcp to npm automaticallyTo enable trusted publishing, configure the package on npmjs.com to trust the release.yml workflow in this repository.
All configuration is via environment variables:
| Variable | Required | Default | Description |
|---|---|---|---|
NSL_PLATFORM_MODE | No | public | public or internal |
NSL_CLIENT_ID | Public mode | — | OAuth client ID from the console |
NSL_CLIENT_SECRET | Public mode | — | OAuth client secret from the console |
NSL_API_KEY | Internal mode | — | API key with admin scope |
NSL_TOKEN_URL | No | https://auth.neuronsearchlab.com/oauth2/token | Token endpoint |
NSL_API_BASE_URL | No | https://api.neuronsearchlab.com in public mode, https://console.neuronsearchlab.com in internal mode | API base URL |
NSL_TIMEOUT_MS | No | 15000 | Request timeout in milliseconds |
get_recommendationsFetch personalised recommendations for a user. Returns ranked items with scores and a request_id for attribution.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
user_id | string | Yes | User identifier (UUID, email, or any stable string) |
context_id | string | No | Context ID from the console — controls filters, grouping, and quantity defaults |
limit | integer 1–200 | No | Number of items to return (defaults to context value, usually 20) |
surface | string | No | Rerank surface override (e.g. "homepage", "sidebar") |
Example
Get 10 recommendations for user alice@example.com using context homepage-feed
get_auto_recommendationsFetch the next auto-generated section for a user's feed. Designed for infinite-scroll — each call returns one curated section (e.g. "Trending this week", "New for you") plus a cursor for the next section. Call until done: true.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
user_id | string | Yes | User identifier |
context_id | string | No | Optional context ID |
limit | integer 1–200 | No | Items per section |
cursor | string | No | Pagination cursor from the previous response |
window_days | integer | No | Days to look back for "new" content |
track_eventRecord a user interaction. Always pass request_id from the recommendations response to enable click-through attribution.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
event_id | integer | Yes | Numeric event type ID from the admin console |
user_id | string | Yes | User who triggered the event |
item_id | string | Yes | Item that was interacted with |
request_id | string | No | request_id from the recommendations response (for attribution) |
session_id | string | No | Session identifier for grouping events within a visit |
upsert_itemAdd or update an item in the catalogue. The description field is used to generate the embedding — write it to be rich and descriptive.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
item_id | string | Yes | Unique item identifier |
name | string | Yes | Display name |
description | string | Yes | Rich description for embedding generation |
metadata | object | No | Arbitrary key-value pairs returned with recommendations |
patch_itemPartially update an existing catalogue item.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
item_id | string | Yes | Item to update |
active | boolean | No | false to exclude from recommendations without deleting |
delete_itemsPermanently remove items. Cannot be undone. To temporarily exclude, use patch_item with active: false.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
item_ids | string[] (max 100) | Yes | Item IDs to delete |
search_itemsSearch the catalogue by keyword.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Text to search for |
limit | integer 1–100 | No | Max results (default 20) |
explain_rankingExplain why a specific item was ranked at a given position for a user. Returns score breakdown, applied rules, and pipeline trace.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
item_id | string | Yes | Item to explain |
user_id | string | No | User to score against (omit for neutral baseline) |
context_id | string | No | Context ID to apply scoring rules from |
list_contextsList all recommendation contexts (feeds) configured for your team.
Inputs — none
create_contextCreate a new recommendation context.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
context_name | string | Yes | Display name (e.g. "Twitter Feed") |
context_key | string | No | URL-safe key (auto-derived from name) |
context_type | enum | No | homepage_feed, you_may_also_like, item_detail_related, search_assist, campaign_merchandising. Default: homepage_feed |
description | string | No | Optional description |
recommendation_type | enum | No | item_to_item, item_to_user, user_to_item, user_to_user. Default: user_to_item |
Example
Create a new context called "Twitter Feed" with type homepage_feed
update_contextUpdate an existing context.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
context_id | integer | Yes | The context ID to update |
context_name | string | No | New display name |
context_type | enum | No | New context type |
description | string | No | New description |
recommendation_type | enum | No | New recommendation type |
list_pipelinesList all ranking pipelines.
Inputs — none
create_pipelineCreate a new ranking pipeline with default stages.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Pipeline name |
description | string | No | Optional description |
context_id | integer | No | Context to attach this pipeline to |
is_active | boolean | No | Default: true |
update_pipeline / delete_pipelineUpdate or delete a pipeline by pipeline_id.
list_rulesList ranking rules, optionally filtered by context_id.
create_ruleCreate a ranking rule. Rule types:
| Type | Effect |
|---|---|
boost | Increase matching items' scores (use weight 1.0–5.0) |
bury | Decrease matching items' scores (use weight 0.0–1.0) |
pin | Fix matching items at a specific position (use pin_position) |
filter | Remove matching items from results |
cap | Limit matching items to a fraction of results (use cap_fraction) |
diversity | Spread items across a field's values (use diversity_field, diversity_max) |
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Rule display name |
rule_type | enum | Yes | boost, bury, pin, filter, cap, diversity |
conditions | array | Yes | [{ field, operator, value }] — items must match all conditions |
actions | object | Yes | { type, weight?, pin_position?, cap_fraction?, ... } |
context_id | integer | No | Scope rule to a specific context |
description | string | No | Optional description |
priority | integer 0–1000 | No | Higher = evaluated first. Default: 100 |
Example
Create a pin rule called "Pin Nike" that pins items where brand equals "Nike" to position 3, scoped to context 1
update_rule / delete_rule / toggle_rule / enable_rule / disable_ruleUpdate, delete, or enable/disable a rule by rule_id.
get_user_analyticsGet served counts, event breakdown, unique-item activity, and click-through rate for a specific user.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
user_id | string | Yes | User ID or email to inspect |
context_id | string | No | Scope to a specific context |
window | 1d | 7d | 30d | 90d | No | Time window (default 7d) |
get_item_analyticsGet served counts, event breakdown, watch/click counts, and click-through rate for a specific item.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
item_id | string | Yes | Item ID to inspect |
context_id | string | No | Scope to a specific context |
window | 1d | 7d | 30d | 90d | No | Time window (default 7d) |
compare_itemsCompare two items head-to-head by served count, events, clicks, and CTR over the same time window.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
item_a_id | string | Yes | First item ID |
item_b_id | string | Yes | Second item ID |
context_id | string | No | Scope to a specific context |
window | 1d | 7d | 30d | 90d | No | Time window (default 7d) |
top_itemsList the top items by served count or by matching event activity over a time window. Use metric="served" for generic "top item" or "best performing" questions. Use metric="events" when the user explicitly names an engagement signal (e.g. watch, click, purchase).
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
metric | served | events | No | Rank by served count or event count (default served) |
event_name | string | No | Event name filter when metric=events (e.g. "watch", "click") |
event_id | integer | No | Numeric event ID filter when metric=events |
context_id | string | No | Scope to a specific context |
window | 1d | 7d | 30d | 90d | No | Time window (default 7d) |
limit | integer 1–50 | No | Max items to return (default 10) |
Example
What's the top item served in the last 7 days?
Which items had the most watch events last month?
Public mode uses OAuth 2.0 Client Credentials. Tokens are fetched on startup, cached in memory, and auto-refreshed 60 seconds before expiry.
Internal mode uses a NeuronSearchLab API key with the admin scope. Set NSL_API_KEY and NSL_PLATFORM_MODE=internal.
git clone https://github.com/NeuronSearchLab/mcp
cd mcp
npm install
export NSL_CLIENT_ID=your-client-id
export NSL_CLIENT_SECRET=your-client-secret
npm run dev # dev mode (tsx, no build)
npm run build # compile to dist/
MIT
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.