Skip to content

Add RAGMap to registry - #311

Merged
JoJoJoJoJoJoJo merged 6 commits into
pathintegral-institute:mainfrom
khalidsaidi:add-ragmap
Mar 27, 2026
Merged

Add RAGMap to registry#311
JoJoJoJoJoJoJo merged 6 commits into
pathintegral-institute:mainfrom
khalidsaidi:add-ragmap

Conversation

@khalidsaidi

@khalidsaidi khalidsaidi commented Feb 19, 2026

Copy link
Copy Markdown
Contributor

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.

Schema validated per mcp-registry/README (name, display_name, description, repository, license, installations).

Summary by CodeRabbit

  • New Features

    • Added RAGMap server registry: discover, search, browse categories, and view scoring explanations for RAG servers.
    • Included installation options (local via npx and hosted HTTP) and a "Find RAG servers" example.
  • Improvements

    • Safer rendering of server details, installation steps, URLs and examples to prevent display issues and ensure accurate user-facing text.

@qodo-code-review

Copy link
Copy Markdown
Contributor

Review Summary by Qodo

Register RAGMap MCP server in registry

✨ Enhancement

Grey Divider

Walkthroughs

Description
• 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
Diagram
flowchart 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"]
Loading

Grey Divider

File Changes

1. mcp-registry/servers/ragmap.json ✨ Enhancement +56/-0

Add RAGMap server registry configuration

• Creates new registry entry for RAGMap MCP server
• Defines four discovery tools for RAG server search and filtering
• Specifies npm (stdio) and HTTP installation methods
• Includes metadata: author, license, categories, tags, and usage examples

mcp-registry/servers/ragmap.json


Grey Divider

Qodo Logo

@coderabbitai

coderabbitai Bot commented Feb 19, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a new RAGMap MCP server manifest (mcp-registry/servers/ragmap.json) with metadata, four tools, installation methods (npm and hosted HTTP), and an example. Also updates src/mcpm/commands/info.py to escape printed output (URLs, text, environment entries, examples) using escape from rich.markup.

Changes

Cohort / File(s) Summary
RAGMap Server Manifest
mcp-registry/servers/ragmap.json
Added new manifest defining server metadata, categories/tags, four tools (rag_find_servers, rag_get_server, rag_list_categories, rag_explain_score), installation methods (npm via npx and hosted HTTP with url), and an example use case.
Installer info output & escaping
src/mcpm/commands/info.py
Added import of escape from rich.markup and applied escaping to all user-facing printed strings (names, descriptions, categories, tags, URLs, installation commands/methods, dependencies, env vars, examples). No public APIs changed.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Suggested labels

Review effort 2/5

Suggested reviewers

  • calmini

Poem

🐇 I hopped in with a manifest bright,
Four tools to guide the search at night,
I escaped the links, tidied each line,
Now RAGMap's listed, neat and fine,
A rabbit's cheer for changes light! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding RAGMap to the MCP server registry, which aligns with the primary objective of the pull request.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@qodo-code-review

qodo-code-review Bot commented Feb 19, 2026

Copy link
Copy Markdown
Contributor

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 📐 Spec deviations (0)

Grey Divider


Remediation recommended

1. HTTP install URL not shown🐞 Bug ✓ Correctness
Description
ragmap.json adds an HTTP installation method that provides only a url, but mcpm info currently
prints only command/args and never prints installation URLs. As a result, users inspecting
RAGMap (or any HTTP-only install method) via mcpm info won’t see the actual MCP endpoint URL.
Code

mcp-registry/servers/ragmap.json[R43-47]

+    "http": {
+      "type": "http",
+      "url": "https://ragmap-mcp.web.app/mcp",
+      "description": "Use hosted Streamable HTTP endpoint (no install)"
+    }
Evidence
The new server entry defines an http installation with a url and no command. In the CLI info
command, installation details only print a command string when the command field exists; there is
no branch that prints url, so HTTP endpoints are omitted from the output.

mcp-registry/servers/ragmap.json[35-47]
src/mcpm/commands/info.py[115-143]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`mcpm info` currently prints installation commands but does not print the `url` field for HTTP installation methods. For servers that offer `type: http` installs (including the newly added `ragmap` entry), the endpoint URL is hidden in the CLI output.
## Issue Context
Registry manifests support `installations` entries of `type: http` where the primary runnable detail is `url` (no `command`/`args`). The CLI should surface that URL in the Installation Details section.
## Fix Focus Areas
- src/mcpm/commands/info.py[115-143]
- mcp-registry/servers/ragmap.json[43-47]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread mcp-registry/servers/ragmap.json Outdated
- 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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread src/mcpm/commands/info.py Outdated
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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/mcpm/commands/info.py (1)

131-131: Consider extending escape() 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_str inside [green]{cmd_str}[/]
  • Line 147: value inside [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 a MarkupError.

♻️ 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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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, name
75 description (server-level)
80 each item in categories
82 each item in tags
84 package
85 author_name, author_email
124 description (method-level), method_type
140 each item in dependencies

Any registry entry whose display name, description, or tags contains [ or ] (e.g., Tool[beta], Tavily[v2]) will cause a MarkupError or 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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_name is not escaped — inconsistent with the rest of this PR's changes.

Lines 31 and 38 embed the user-supplied server_name CLI argument directly into Rich markup f-strings without escape(). A value like server[v2] or [::1] would let Rich attempt to parse the brackets as markup tags, producing garbled output or a MarkupError — 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>
@JoJoJoJoJoJoJo
JoJoJoJoJoJoJo merged commit bdd5ed9 into pathintegral-institute:main Mar 27, 2026
4 checks passed
@mcpm-semantic-release

Copy link
Copy Markdown

🎉 This PR is included in version 2.15.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants