Add RAGMap to registry - #311
Conversation
Review Summary by QodoRegister RAGMap MCP server in registry
WalkthroughsDescription• Registers RAGMap MCP server in the registry • Provides RAG-focused discovery and routing capabilities • Includes npm and HTTP installation options • Documents four core tools for server discovery Diagramflowchart LR
Registry["MCP Registry"]
RAGMap["RAGMap Server"]
Tools["Discovery Tools"]
Installs["Installation Methods"]
Registry -- "adds entry" --> RAGMap
RAGMap -- "provides" --> Tools
RAGMap -- "supports" --> Installs
Tools -- "includes" --> FindServers["rag_find_servers"]
Tools -- "includes" --> GetServer["rag_get_server"]
Tools -- "includes" --> ListCats["rag_list_categories"]
Tools -- "includes" --> ExplainScore["rag_explain_score"]
Installs -- "npm" --> NPMInstall["npx @khalidsaidi/ragmap-mcp"]
Installs -- "http" --> HTTPInstall["https://ragmap-mcp.web.app/mcp"]
File Changes1. mcp-registry/servers/ragmap.json
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds a new RAGMap MCP server manifest ( Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~8 minutes Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Code Review by Qodo
1.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@mcp-registry/servers/ragmap.json`:
- Line 39: The args array currently contains a redundant positional argument:
remove the trailing "ragmap-mcp" from the args value ["-y",
"@khalidsaidi/ragmap-mcp@latest", "ragmap-mcp"] so NPX is called as ["-y",
"@khalidsaidi/ragmap-mcp@latest"] — the package's bin ("ragmap-mcp") is invoked
automatically and the extra "ragmap-mcp" is being passed incorrectly as a CLI
argument to the binary.
- ragmap.json: remove redundant 'ragmap-mcp' from npx args (bin auto-invoked) - info.py: print URL for http installation methods in Installation Details Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/mcpm/commands/info.py`:
- Around line 132-134: The URL string is being interpolated directly into a Rich
markup f-string in the info command, which breaks on bracketed URLs; update the
console.print call(s) that render URL values (e.g., the block using variables
method and method_type in src/mcpm/commands/info.py) to pass the URL through
rich.markup.escape() before formatting (replace method['url'] with
rich.markup.escape(method['url']) in the console.print f-string), and apply the
same escape change to the other URL prints referenced around the function (the
earlier console.print calls at the other URL lines) to ensure all
bracket-containing URLs render safely.
Use rich.markup.escape() for all URL values (repository, homepage, documentation, author, http install URL) so bracketed URLs (e.g. IPv6) render correctly instead of being parsed as markup. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/mcpm/commands/info.py (1)
131-131: Consider extendingescape()to the remaining user-controlled strings inside Rich markup.The PR has established a consistent escaping pattern for URLs, but several other fields sourced from registry JSON are still interpolated raw into Rich markup tags:
- Line 131:
cmd_strinside[green]{cmd_str}[/]- Line 147:
valueinside[green]"{value}"[/]- Line 156:
example['title']inside[bold]{...}[/]- Line 160:
example['code']inside[green]{...}[/]- Line 162:
example['prompt']inside[green]{...}[/]A registry entry with brackets in any of these fields (e.g., a command like
docker run --env [VAR]) would still produce garbled output or aMarkupError.♻️ Proposed fix — apply
escape()consistently- console.print(f"Command: [green]{cmd_str}[/]") + console.print(f"Command: [green]{escape(cmd_str)}[/]")- console.print(f' [bold blue]{key}[/] = [green]"{value}"[/]') + console.print(f' [bold blue]{escape(key)}[/] = [green]"{escape(value)}"[/]')- console.print(f"[bold]{i + 1}. {example['title']}[/]") + console.print(f"[bold]{i + 1}. {escape(example['title'])}[/]")- console.print(f" Code: [green]{example['code']}[/]") + console.print(f" Code: [green]{escape(example['code'])}[/]")- console.print(f" Prompt: [green]{example['prompt']}[/]") + console.print(f" Prompt: [green]{escape(example['prompt'])}[/]")Also applies to: 147-147, 156-156, 160-162
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/mcpm/commands/info.py` at line 131, Several user-controlled strings are interpolated directly into Rich markup (cmd_str, value, example['title'], example['code'], example['prompt']) which can produce garbled output or MarkupError; wrap each of these values with the existing escape() function before inserting into f-strings passed to console.print (e.g., use escape(cmd_str), escape(value), escape(str(example['title'] or "")), escape(str(example['code'] or "")), escape(str(example['prompt'] or ""))) and ensure escape is imported/available in the module so all Rich markup receives escaped content.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@src/mcpm/commands/info.py`:
- Line 131: Several user-controlled strings are interpolated directly into Rich
markup (cmd_str, value, example['title'], example['code'], example['prompt'])
which can produce garbled output or MarkupError; wrap each of these values with
the existing escape() function before inserting into f-strings passed to
console.print (e.g., use escape(cmd_str), escape(value),
escape(str(example['title'] or "")), escape(str(example['code'] or "")),
escape(str(example['prompt'] or ""))) and ensure escape is imported/available in
the module so all Rich markup receives escaped content.
Apply escape() to cmd_str, env key/value, and example title/description/code/prompt so registry content with brackets never triggers Rich markup parsing. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/mcpm/commands/info.py (1)
74-85: Incomplete escaping — several registry-sourced strings remain unescaped.The commit message promises "escape all user-controlled strings," but the following unchanged prints still interpolate registry content directly into Rich markup:
Line Unescaped variable(s) 74 display_name,name75 description(server-level)80 each item in categories82 each item in tags84 package85 author_name,author_email124 description(method-level),method_type140 each item in dependenciesAny registry entry whose display name, description, or tags contains
[or](e.g.,Tool[beta],Tavily[v2]) will cause aMarkupErroror garbled output.♻️ Suggested fix
- console.print(f"[bold cyan]{display_name}[/] [dim]({name})[/]") - console.print(f"[italic]{description}[/]\n") + console.print(f"[bold cyan]{escape(display_name)}[/] [dim]({escape(name)})[/]") + console.print(f"[italic]{escape(description)}[/]\n") if categories: - console.print(f"Categories: {', '.join(categories)}") + console.print(f"Categories: {', '.join(escape(c) for c in categories)}") if tags: - console.print(f"Tags: {', '.join(tags)}") + console.print(f"Tags: {', '.join(escape(t) for t in tags)}") if package: - console.print(f"Package: {package}") + console.print(f"Package: {escape(package)}") - console.print(f"Author: {author_name}" + (f" ({author_email})" if author_email else "")) + console.print(f"Author: {escape(author_name)}" + (f" ({escape(author_email)})" if author_email else "")) ... - console.print(f"[cyan]{method_type}[/]: {description}{recommended}") + console.print(f"[cyan]{escape(method_type)}[/]: {escape(description)}{recommended}") ... - console.print("Dependencies: " + ", ".join(dependencies)) + console.print("Dependencies: " + ", ".join(escape(d) for d in dependencies))Also applies to: 124-124, 140-140
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/mcpm/commands/info.py` around lines 74 - 85, The Rich prints are interpolating registry-controlled strings (display_name, name, description, categories, tags, package, author_name, author_email, method_type, dependencies) without escaping, which breaks markup when values contain [ or ]; fix by escaping or disabling markup: sanitize each user-controlled variable with rich.markup.escape(...) before embedding in formatted markup or call console.print(..., markup=False) when printing raw strings (for multi-item joins like categories/tags/dependencies escape each item). Update the console.print calls that reference display_name, name, description, categories, tags, package, author_name/author_email, method_type and dependencies accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@src/mcpm/commands/info.py`:
- Around line 74-85: The Rich prints are interpolating registry-controlled
strings (display_name, name, description, categories, tags, package,
author_name, author_email, method_type, dependencies) without escaping, which
breaks markup when values contain [ or ]; fix by escaping or disabling markup:
sanitize each user-controlled variable with rich.markup.escape(...) before
embedding in formatted markup or call console.print(..., markup=False) when
printing raw strings (for multi-item joins like categories/tags/dependencies
escape each item). Update the console.print calls that reference display_name,
name, description, categories, tags, package, author_name/author_email,
method_type and dependencies accordingly.
Escape display_name, name, description, categories, tags, package, author_name, author_email, license_info, method_type, description (method), and dependencies so any [ or ] in registry content never breaks markup. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/mcpm/commands/info.py (1)
31-31:⚠️ Potential issue | 🟡 Minor
server_nameis not escaped — inconsistent with the rest of this PR's changes.Lines 31 and 38 embed the user-supplied
server_nameCLI argument directly into Rich markup f-strings withoutescape(). A value likeserver[v2]or[::1]would let Rich attempt to parse the brackets as markup tags, producing garbled output or aMarkupError— the exact class of bug this PR is fixing everywhere else.🛡️ Proposed fix
- console.print(f"[bold green]Showing information for MCP server:[/] [bold cyan]{server_name}[/]") + console.print(f"[bold green]Showing information for MCP server:[/] [bold cyan]{escape(server_name)}[/]")- console.print(f"[yellow]Server '[bold]{server_name}[/]' not found.[/]") + console.print(f"[yellow]Server '[bold]{escape(server_name)}[/]' not found.[/]")Also applies to: 38-38
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/mcpm/commands/info.py` at line 31, The console.print calls embed the user-provided server_name directly into Rich markup f-strings, which can cause MarkupError for bracketed values; update both console.print usages that interpolate server_name to wrap it with rich.markup.escape(server_name) (and add the import for escape if missing) so the server_name is properly escaped before printing.
🧹 Nitpick comments (2)
src/mcpm/commands/info.py (2)
140-140: Minor style inconsistency — use an f-string for consistency with lines 80 and 82.Lines 80 and 82 use
f"...: {', '.join(...)}"for the same pattern. Line 140 uses string concatenation with+.♻️ Proposed refactor
- console.print("Dependencies: " + ", ".join(escape(str(d)) for d in dependencies)) + console.print(f"Dependencies: {', '.join(escape(str(d)) for d in dependencies)}")🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/mcpm/commands/info.py` at line 140, Replace the string concatenation in the console.print call with an f-string to match the style used on lines 80/82; specifically update the console.print("Dependencies: " + ", ".join(escape(str(d)) for d in dependencies)) expression in info.py to use an f-string like f"Dependencies: {', '.join(escape(str(d)) for d in dependencies)}" so the formatting is consistent with the other prints in this module.
85-85: Refactor to a single f-string to improve readability — line currently is 109 characters, exceeding ruff's default 88-character limit.The current form concatenates an f-string with a trailing ternary operator. Collapsing it into a single f-string with an inline conditional is more idiomatic.
♻️ Proposed refactor
- console.print(f"Author: {escape(author_name)}" + (f" ({escape(author_email)})" if author_email else "")) + console.print(f"Author: {escape(author_name)}{f' ({escape(author_email)})' if author_email else ''}")Note: The refactored line is 102 characters, which is an improvement from 109 but still exceeds the 88-character default. If stricter compliance is required, consider extracting the email part to a separate variable.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/mcpm/commands/info.py` at line 85, Refactor the console.print call that builds the author string to use a single f-string with an inline conditional instead of concatenating two f-strings; update the expression using escape(author_name) and escape(author_email) inside one f-string (e.g., f"Author: {escape(author_name)}{f' ({escape(author_email)})' if author_email else ''}") to improve readability and avoid the concatenation; if you need to meet the 88-character limit, extract the email fragment into a small variable (e.g., email_part) before calling console.print.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In `@src/mcpm/commands/info.py`:
- Line 31: The console.print calls embed the user-provided server_name directly
into Rich markup f-strings, which can cause MarkupError for bracketed values;
update both console.print usages that interpolate server_name to wrap it with
rich.markup.escape(server_name) (and add the import for escape if missing) so
the server_name is properly escaped before printing.
---
Nitpick comments:
In `@src/mcpm/commands/info.py`:
- Line 140: Replace the string concatenation in the console.print call with an
f-string to match the style used on lines 80/82; specifically update the
console.print("Dependencies: " + ", ".join(escape(str(d)) for d in
dependencies)) expression in info.py to use an f-string like f"Dependencies: {',
'.join(escape(str(d)) for d in dependencies)}" so the formatting is consistent
with the other prints in this module.
- Line 85: Refactor the console.print call that builds the author string to use
a single f-string with an inline conditional instead of concatenating two
f-strings; update the expression using escape(author_name) and
escape(author_email) inside one f-string (e.g., f"Author:
{escape(author_name)}{f' ({escape(author_email)})' if author_email else ''}") to
improve readability and avoid the concatenation; if you need to meet the
88-character limit, extract the email fragment into a small variable (e.g.,
email_part) before calling console.print.
…r 88 chars - Escape user-supplied server_name in both Rich prints (lines 31, 38) - Dependencies: use f-string to match Categories/Tags style - Author: single f-string with email_part variable for 88-char compliance Co-authored-by: Cursor <cursoragent@cursor.com>
|
🎉 This PR is included in version 2.15.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
Adds RAGMap to the MCP server registry. RAGMap is a RAG-focused subregistry + MCP server to discover retrieval-capable MCP servers with semantic search, filters, and explainable ranking.
npx -y @khalidsaidi/ragmap-mcp@latest(stdio, uses hosted API)Schema validated per mcp-registry/README (name, display_name, description, repository, license, installations).
Summary by CodeRabbit
New Features
Improvements