NoundryMCP

Model Context Protocol (MCP) server providing AI assistants with access to Noundry documentation, code examples, and project scaffolding capabilities. Works with Claude Code, Claude Desktop, Cursor, Windsurf, and any MCP-compatible client.

What is NoundryMCP?

NoundryMCP is a hosted MCP server that integrates with Claude Desktop, Claude Code, and other MCP-compatible AI clients. It gives AI assistants the ability to search Noundry documentation, retrieve code examples, and help you scaffold new Noundry projects directly from your conversations. No API keys or authentication required for public documentation access.

Markdown Processing

Loads and parses markdown files with YAML frontmatter, converts to HTML using Markdig with advanced extensions.

Full-Text Search

Intelligent search with relevance ranking across all Noundry documentation. Returns snippets and relevance scores.

Auto-Reload

Automatically detects and reloads documentation when files change (2-second debounce). No server restarts needed.

Rich Metadata

Supports titles, descriptions, tags, and more via YAML frontmatter for precise filtering and discovery.

Quick Setup

Claude Code

$ claude mcp add --transport http noundry-docs https://mcp.noundry.ai/mcp

Claude Desktop / Cursor / Windsurf

Add to your MCP configuration file:

{
 "mcpServers": {
 "noundry": {
 "url": "https://mcp.noundry.ai/mcp"
 }
 }
}

With Authentication (Private Instances)

For self-hosted instances that require API key authentication:

{
 "mcpServers": {
 "noundry-docs": {
 "type": "http",
 "url": "https://mcp.noundry.ai/mcp",
 "headers": {
 "Authorization": "Bearer ${NOUNDRY_API_KEY}"
 }
 }
 }
}

Config File Locations

Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json

Available MCP Tools

ListDocs

List all available documentation files with optional keyword filtering by title, description, tags, or filename.

// Example call
ListDocs filter="api"

// Response
{
 "totalCount": 5,
 "filter": "api",
 "docs": [
 {
 "fileName": "api-reference",
 "title": "API Reference",
 "description": "Complete API documentation",
 "tags": ["api", "reference"],
 "lastModified": "2025-10-04 10:30:00"
 }
 ]
}

GetDoc

Retrieve the full content of a specific document by filename (without .md extension). Returns both markdown and rendered HTML.

// Example call
GetDoc docName="getting-started"

// Response
{
 "metadata": {
 "fileName": "getting-started",
 "title": "Getting Started",
 "tags": ["intro", "setup"]
 },
 "content": {
 "markdown": "# Getting Started\n\n...",
 "html": "<h1>Getting Started</h1>..."
 }
}

SearchDocs

Full-text search with relevance ranking. Returns snippets and relevance scores. Maximum 20 results.

// Example call
SearchDocs query="authentication" maxResults="10"

// Response
{
 "query": "authentication",
 "resultCount": 3,
 "results": [
 {
 "fileName": "auth-guide",
 "title": "Authentication Guide",
 "snippet": "...authentication process...",
 "relevance": 150.5
 }
 ]
}

GetStats

Get statistics about the documentation collection including document count, tag distribution, and recently modified files.

// Response
{
 "totalDocuments": 42,
 "totalTags": 15,
 "mostCommonTags": [
 { "tag": "api", "count": 12 },
 { "tag": "guide", "count": 8 }
 ],
 "recentlyModified": [...]
}

ReloadDocs

Manually reload all documentation files from disk. Useful when auto-reload is disabled or to force immediate refresh without waiting for the 2-second debounce timer.

// Response
{
 "success": true,
 "message": "Documentation reloaded successfully",
 "documentCount": 42
}

Document Frontmatter Format

Documents should include YAML frontmatter for rich metadata. If no frontmatter is provided, the first H1 heading will be used as the title.

---
title: Document Title
description: Brief description of the document
tags: tag1, tag2, tag3
---

# Document Content

Your markdown content here...

API Endpoints

Endpoint Method Auth Description
/ GET No Server information and usage examples
/mcp POST Yes MCP protocol endpoint for tool calls
/health GET No Health check endpoint

Usage Examples

Once connected, your AI assistant can use NoundryMCP tools transparently. Just ask natural language questions about Noundry:

You: "How do I add input validation to my ASP.NET Core app?"

Claude: Searches documentation and provides Noundry.Sod validation examples with setup instructions.

You: "Create a new web API project with Noundry"

Claude: Provides commands to install templates and scaffold a new API project with authentication.

You: "Show me how to use Noundry.DotEnvX for environment variables"

Claude: Retrieves code examples showing configuration, encryption, and validation setup.

You: "What Noundry packages are available for database access?"

Claude: Lists Tuxedo ORM, Connector, Slurp, and Bowtie with feature summaries and installation commands.

Benefits

  • Get instant answers about Noundry features and usage
  • Access code examples without leaving your conversation
  • Generate project scaffolding commands on the fly
  • Learn best practices from curated recommendations
  • No API keys or authentication required for public access
  • Works with all major MCP-compatible AI clients

Adding Custom Tools

Extend NoundryMCP with your own MCP tools by adding methods to the tools class:

[McpServerTool]
[Description("Your tool description")]
public string YourTool(
 [Description("Parameter description")] string param)
{
 var result = _docsService.YourMethod(param);
 return JsonSerializer.Serialize(result, JsonOptions);
}

Troubleshooting

"Docs path does not exist"

Ensure the path in appsettings.json points to a valid directory containing markdown files.

"Invalid API key"

Check that the Authorization header matches one of the keys in the ApiKeys array. Both Bearer <key> and raw key formats are accepted.

No documents loaded

Verify markdown files exist in the configured path, check file permissions, and look for parsing errors in application logs.

Port already in use

Change the port in appsettings.json under Kestrel:Endpoints.

Docker Deployment

# Build the Docker image
$ docker build -t noundry-mcp .

# Run with mounted docs and API key
$ docker run -d -p 80:80 -p 443:443 \
 -v /path/to/docs:/docs \
 -e NoundryDocs__Path=/docs \
 -e ApiKeys__0=your-api-key \
 noundry-mcp

Related Packages