mcp-doc-search
by gituser5525
README.md
# MCP Doc Search
# MCP Document Search Server
## Overview
This project was built as a hands-on exercise to understand the Model Context Protocol (MCP) by implementing all three core MCP primitives:
* Prompts
* Tools
* Resources
The final outcome is a simple documentation search MCP server that exposes:
* A `search_docs` tool for searching documentation
* Dynamic resources representing documents stored in a local `docs/` folder
The server can be tested and explored using the MCP Inspector.
---
## MCP Concepts Learned
### 1. Prompts
Prompts are reusable instruction templates exposed by an MCP server.
Pattern:
* `prompts/list`
* `prompts/get`
Example:
```text
simple
```
A client can discover available prompts and retrieve the prompt content.
---
### 2. Tools
Tools expose executable functionality.
Pattern:
* `tools/list`
* `tools/call`
Examples implemented during learning:
```text
fetch
add
multiply
search_docs
```
A tool receives arguments, performs some action, and returns structured results.
---
### 3. Resources
Resources expose data that can be read by a client.
Pattern:
* `resources/list`
* `resources/read`
````
Examples:
```text
docs://mcp
docs://architecture
docs://retrieval
````
Resources represent existing data and are analogous to files or documents.
---
## MCP Mental Model
```text
Tool = Function
Resource = File
Prompt = Template
```
Examples:
```text
search_docs("MCP") -> Tool
docs://mcp -> Resource
code-review-template -> Prompt
```
---
## Current Architecture
```text
MCP Client
│
├── search_docs(query) [Tool]
│
└── docs://* [Resources]
│
└── read_resource()
```
### Search Flow
```text
User Query
↓
search_docs("MCP")
↓
Returns matching resource URIs
↓
docs://mcp
↓
read_resource("docs://mcp")
↓
Returns document content
```
This demonstrates the common MCP pattern:
```text
Tool → Resource Chain
```
---
## Project Structure
```text
doc-search/
│
├── README.md
├── pyproject.toml
│
└── mcp_doc_search/
│
├── __init__.py
├── __main__.py
├── server.py
│
└── docs/
├── architecture.txt
├── retrieval.txt
└── mcp.txt
```
---
## Features
### Tool: search_docs
Input:
```json
{
"query": "MCP"
}
```
Behavior:
* Searches all `.txt` files in the `docs` directory
* Performs a case-insensitive search
* Returns matching resource URIs
Example output:
```text
docs://mcp
```
---
### Resources
Resources are generated dynamically from the `docs` directory.
Examples:
```text
docs://mcp
docs://architecture
docs://retrieval
```
Reading a resource returns the document content.
---
## Testing
The server can be tested using MCP Inspector.
Example configuration:
Command:
```text
uv
```
Arguments:
```text
run python -m mcp_doc_search
```
The Inspector can then:
* List tools
* Call `search_docs`
* List resources
* Read resources
---
## Key Takeaways
* MCP follows a consistent discovery and execution pattern.
* Tools are used for actions and discovery.
* Resources are used for retrieving known content.
* Prompts are reusable instruction templates.
* Many knowledge and retrieval servers follow a Tool → Resource architecture.
* The MCP layer remains stable even when the retrieval implementation evolves from simple file search to BM25, vector search, hybrid search, or databases.
---
## Future Improvements
* BM25 search
* Vector search
* Hybrid search
* SingleStore integration
* Result ranking and scoring
* Resource metadata
* Claude Desktop / Cursor integration
* Retrieval-Augmented Generation (RAG)
-- -----------------
create venv: uv venv
Go to correct toml file and run: uv sync
uv run python -m mcp_simple_prompt --help
>uv run python -m mcp_doc_search --help
Install inspector: npx @modelcontextprotocol/inspector and runs it port:6274
(For stdio transport, Inspector itself launches the server, so need not run uv run mcp-simple-prompt in another terminal)
or run
python
-m
mcp_doc_search in the arguments
Enter the proxy token or launch the Proxy configured url and enter-> Command: uv and arguments: run mcp-simple-prompt
TDQS
B3.1/5.0
Scored across 1 tool
Disambiguation5/5
With only one tool, there is no possibility of confusing it with another. The tool's purpose is clear from its name and description.
Naming Consistency5/5
The single tool uses a consistent verb_noun pattern, and there are no other tools to introduce inconsistency.
Tool Count3/5
The server has just one tool, which is thin but appropriate for a narrowly-focused search-only service. It falls on the borderline of being too sparse.
Completeness2/5
Only search is supported, with no way to fetch or list documents. This creates a significant gap: after searching, the agent cannot retrieve the actual content of a result.
Maintenance
ActivityInactive
ResponsivenessNo issues