MCP server and TypeScript SDK for OOREP homeopathic repertory and materia medica reference data.
An MCP server and TypeScript client SDK that gives AI assistants access to OOREP's homeopathic repertory and materia medica reference data.
# Install and run (no setup required)
npx -y oorep-mcp
// Or use programmatically
import { createOOREPClient } from 'oorep-mcp';
const client = createOOREPClient();
const results = await client.searchRepertory({ symptom: 'headache worse motion' });
console.log(results.rubrics);
client.destroy();
Ask your AI assistant: "Search OOREP for remedies for throbbing headache worse from light"
OOREP (Open Online Repertory) is an open-source homeopathic database containing:
graph TB
subgraph Repertory[Repertory Structure]
Chapter[Chapter<br/>e.g. Head]
Rubric[Rubric<br/>e.g. Pain - Throbbing]
R1[Belladonna - 4]
R2[Glonoine - 3]
R3[Natrum mur - 2]
Chapter --> Rubric
Rubric --> R1
Rubric --> R2
Rubric --> R3
end
subgraph MateriaMedica[Materia Medica Structure]
Remedy[Remedy<br/>e.g. Belladonna]
S1[Mind: Sudden onset...]
S2[Head: Throbbing pain...]
S3[...]
Remedy --> S1
Remedy --> S2
Remedy --> S3
end
This MCP server enables AI assistants to query this data programmatically.
| Feature | Description |
|---|---|
| Search Repertories | Query symptoms across 12+ repertories, get matching rubrics with weighted remedies |
| Search Materia Medicas | Find remedy descriptions and indications from multiple sources |
| Remedy Information | Get comprehensive details for 600+ remedies |
| List Resources | Browse available repertories, materia medicas, and remedies |
| Guided Workflows | Prompts for symptom analysis, remedy comparison, case repertorization |
| Structured Responses | MCP 2025-06-18 compliant with outputSchema and structuredContent |
| Performance | Built-in caching (5min TTL), request deduplication, automatic retries |
| Type Safety | Full TypeScript with Zod validation on all inputs |
| Security | Input sanitization, error message sanitization, no credentials required |
| SDK Adapters | Direct integration with OpenAI, Vercel AI SDK, LangChain, Google Gemini |
Requires Node.js 22.12 or newer with npm/npx.
macOS: Edit ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: Edit %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"oorep": {
"command": "npx",
"args": ["-y", "oorep-mcp"]
}
}
}
Quit completely (Cmd+Q / Alt+F4), then reopen.
You: "Search OOREP for remedies for headache worse at night"
Claude will:
search_repertory with symptom "headache worse night"No installation required:
npx -y oorep-mcp
npm install -g oorep-mcp
oorep-mcp
npm install oorep-mcp
claude mcp add oorep -- npx -y oorep-mcp
~/.claude.json){
"mcpServers": {
"oorep": {
"command": "npx",
"args": ["-y", "oorep-mcp"],
"env": {
"OOREP_MCP_BASE_URL": "https://www.oorep.com",
"OOREP_MCP_LOG_LEVEL": "info"
}
}
}
}
Verify: Run /mcp in Claude Code
Config locations:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"oorep": {
"command": "npx",
"args": ["-y", "oorep-mcp"],
"env": {
"OOREP_MCP_BASE_URL": "https://www.oorep.com",
"OOREP_MCP_LOG_LEVEL": "info"
}
}
}
}
Important: Quit completely (Cmd+Q), not just close window.
Config: ~/.codex/config.toml (macOS/Linux) or C:\Users\<Username>\.codex\config.toml (Windows)
[mcp_servers.oorep]
command = "npx"
args = ["-y", "oorep-mcp"]
startup_timeout_sec = 15.0
tool_timeout_sec = 60.0
[mcp_servers.oorep.env]
OOREP_MCP_BASE_URL = "https://www.oorep.com"
OOREP_MCP_LOG_LEVEL = "info"
Or via CLI:
codex mcp add oorep --env OOREP_MCP_BASE_URL=https://www.oorep.com --env OOREP_MCP_LOG_LEVEL=info -- npx -y oorep-mcp
Verify: Run codex mcp list
Config: ~/.gemini/settings.json
{
"mcpServers": {
"oorep": {
"command": "npx",
"args": ["-y", "oorep-mcp"],
"env": {
"OOREP_MCP_BASE_URL": "https://www.oorep.com",
"OOREP_MCP_LOG_LEVEL": "info"
},
"timeout": 30000
}
}
}
Once installed, you can interact with OOREP through Claude naturally:
You: "Can you search OOREP for remedies for headache that's worse at night?"
Claude will:
search_repertory toolYou: "Tell me more about Aconite - what conditions is it used for?"
Claude will:
get_remedy_info tool to fetch details about AconiteYou: "Compare Aconite and Belladonna for fever symptoms"
Claude will:
remedy-comparison promptYou: "I want to repertorize a case with these symptoms: anxiety, palpitations, and insomnia"
Claude will:
repertorization-workflow promptYou: "What repertories are available in OOREP?"
Claude will:
list_available_repertories toolsearch_repertorySearch for symptoms in homeopathic repertories.
Parameters:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
symptom | string | Yes | - | Symptom to search (3-200 chars). Supports wildcards. |
repertory | string | No | publicum | Repertory abbreviation (e.g., kent, boger) |
minWeight | number | No | 1 | Minimum remedy weight (1-4) |
maxResults | number | No | 20 | Maximum rubrics to return (1-100) |
includeRemedyStats | boolean | No | true | Include aggregated remedy statistics |
Returns:
{
totalResults: number;
rubrics: Array<{
rubric: string; // Full path: "Head > Pain > Throbbing"
text: string | null; // Additional rubric text
repertory: string; // Repertory abbreviation
remedies: Array<{
name: string; // Full name: "Belladonna"
abbreviation: string; // "Bell."
weight: number; // 1-4
}>;
}>;
remedyStats?: Array<{ // If includeRemedyStats=true
name: string;
abbreviation: string;
count: number; // Times appearing
cumulativeWeight: number; // Sum of weights
}>;
}
search_materia_medicaSearch materia medica texts for remedy descriptions.
Parameters:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
symptom | string | Yes | - | Symptom to search (3-200 chars) |
materiamedica | string | No | boericke | Materia medica abbreviation |
remedy | string | No | - | Filter to specific remedy |
maxResults | number | No | 10 | Maximum results (1-50) |
Returns:
{
totalResults: number;
results: Array<{
remedy: string; // "Aconitum napellus"
materiaMedica: string; // "boericke"
sections: Array<{
heading: string; // "Mind", "Head", etc.
content: string; // Section text
depth: number; // Heading depth
}>;
}>;
}
get_remedy_infoGet detailed information about a specific remedy.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
remedy | string | Yes | Remedy name, abbreviation, or alternate name (1-100 chars) |
Returns:
{
id: number;
nameAbbrev: string; // "Acon."
nameLong: string; // "Aconitum napellus"
namealt: string[]; // ["Aconite", "Monkshood"]
} | null // null if not found
Matching behavior:
list_available_repertoriesList all accessible repertories.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
language | string | No | Filter by language code (e.g., en, de) |
Returns:
Array<{
abbreviation: string; // "kent"
title: string; // "Kent Repertory"
author: string; // "James Tyler Kent"
language: string; // "en"
}>
list_available_materia_medicasList all accessible materia medica texts.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
language | string | No | Filter by language code |
Returns:
Array<{
abbreviation: string; // "boericke"
title: string; // "Boericke Materia Medica"
author: string; // "William Boericke"
language: string; // "en"
}>
All tools support the MCP 2025-06-18 specification with structured responses:
Response Structure:
{
// Text content for backwards compatibility
content: [{
type: 'text',
text: '{"totalResults": 42, "rubrics": [...]}' // JSON string
}],
// Machine-parseable structured content
structuredContent: {
totalResults: 42,
rubrics: [...] // Actual JavaScript object
}
}
Benefits:
isError: true for LLM self-correction| URI | Description | Content Type |
|---|---|---|
oorep://remedies/list | Complete list of all 600+ remedies | JSON |
oorep://repertories/list | All available repertories with metadata | JSON |
oorep://materia-medicas/list | All available materia medicas | JSON |
oorep://help/search-syntax | Search syntax guide with examples | Text |
analyze-symptomsGuided workflow for systematic symptom analysis.
Arguments:
| Name | Type | Required | Description |
|---|---|---|---|
symptom_description | string | No | Initial symptom description |
Workflow: Guides through symptom gathering → modality analysis → repertory search → synthesis
remedy-comparisonCompare multiple remedies side-by-side.
Arguments:
| Name | Type | Required | Description |
|---|---|---|---|
remedies | string | Yes | Comma-separated remedy names (2-6 remedies) |
Example: remedies: "Aconite, Belladonna, Gelsemium"
repertorization-workflowStep-by-step case taking and repertorization.
Workflow: 7-step process from symptom collection through remedy differentiation.
headache # Simple term
headache night # Multiple terms (AND)
head* # Matches: head, headache, heading
*ache # Matches: headache, stomachache
"worse at night" # Exact phrase match
"throbbing pain" # Must appear together
headache -migraine # Headache but not migraine
fever -intermittent # Fever excluding intermittent
head* pain -chronic "worse motion"
For programmatic use with AI frameworks, see the SDK Integration Guide.
Supported frameworks: OpenAI, Vercel AI SDK, LangChain/LangGraph, Google Gemini
Quick example:
import { createOOREPClient } from 'oorep-mcp';
const client = createOOREPClient();
const results = await client.searchRepertory({ symptom: 'headache worse motion' });
console.log(results.rubrics);
client.destroy();
All configuration via environment variables:
| Variable | Default | Description |
|---|---|---|
OOREP_MCP_BASE_URL | https://www.oorep.com | OOREP API base URL |
OOREP_MCP_TIMEOUT_MS | 30000 | Request timeout (ms) |
OOREP_MCP_CACHE_TTL_MS | 300000 | Cache TTL (ms), 0 to disable |
OOREP_MCP_MAX_RESULTS | 100 | Maximum results cap |
OOREP_MCP_LOG_LEVEL | info | debug | info | warn | error |
OOREP_MCP_DEFAULT_REPERTORY | publicum | Default repertory |
OOREP_MCP_DEFAULT_MATERIA_MEDICA | boericke | Default materia medica |
OOREP_MCP_REMOTE_USER | (unset) | If set, sends X-Remote-User header (numeric member ID) on all upstream requests |
The MCP server maintains an anonymous OOREP session automatically. It performs a lightweight bootstrap request to fetch the required cookies and reuses them for subsequent search calls, so no additional authentication setup is necessary for public data.
Example with custom config:
{
"mcpServers": {
"oorep": {
"command": "npx",
"args": ["-y", "oorep-mcp"],
"env": {
"OOREP_MCP_TIMEOUT_MS": "60000",
"OOREP_MCP_CACHE_TTL_MS": "600000",
"OOREP_MCP_LOG_LEVEL": "debug"
}
}
}
}
graph TB
subgraph Client[MCP Client]
MCPClient((Claude, Codex,<br/>Gemini, etc.))
end
subgraph Server[OOREP MCP Server]
Tools[Tools]
Resources[Resources]
Prompts[Prompts]
SDK[SDK]
subgraph SDKClient[OOREPClient]
Cache[(Cache)]
Dedup[Deduplicator]
Validators[Validators]
end
subgraph HTTPClient[OOREPClient - HTTP]
Session[Session mgmt]
Retry[Retry logic]
Timeout[Timeout handling]
end
Tools --> SDKClient
Resources --> SDKClient
Prompts --> SDKClient
SDK --> SDKClient
SDKClient --> HTTPClient
end
subgraph External[OOREP API]
API[https://www.oorep.com]
end
MCPClient -->|MCP Protocol| Server
HTTPClient -->|HTTPS| API
Key Components:
All inputs are validated using Zod schemas:
The OOREP MCP Server does not implement internal rate limiting. However:
The upstream OOREP API may have rate limits. If you exceed them, you'll receive a RateLimitError:
{
content: [{ type: 'text', text: 'Error: Rate limit exceeded. Please try again later.' }],
isError: true
}
Enable caching (default: 5 minutes TTL)
"env": { "OOREP_MCP_CACHE_TTL_MS": "300000" }
Reduce concurrent requests by using specific search terms
Increase cache TTL for frequently accessed data
"env": { "OOREP_MCP_CACHE_TTL_MS": "600000" }
The SDK client automatically deduplicates concurrent identical requests, reducing API load.
Import types directly from the package for type-safe development:
import type {
// Tool argument types
SearchRepertoryArgs,
SearchMateriaMedicaArgs,
GetRemedyInfoArgs,
ListRepertoriesArgs,
ListMateriaMedicasArgs,
// Result types
RepertorySearchResult,
MateriaMedicaSearchResult,
RemedyInfo,
RepertoryMetadata,
MateriaMedicaMetadata,
// Supporting types
Rubric,
Remedy,
MateriaMedicaResult,
MateriaMedicaSection,
// SDK Client types
OOREPClient,
OOREPSDKConfig,
} from 'oorep-mcp';
You can also import Zod schemas for runtime validation:
import {
SearchRepertoryArgsSchema,
RepertorySearchResultSchema,
RemedyInfoSchema,
} from 'oorep-mcp';
// Validate external data
const validated = SearchRepertoryArgsSchema.parse(untrustedInput);
Problem: The MCP indicator doesn't show up after configuration.
Solutions:
~/Library/Logs/Claude/mcp*.log%APPDATA%\Claude\Logs\mcp*.lognpx -y oorep-mcp in terminal to check if it startsProblem: "Connection timeout" or "Request timed out" errors.
Solutions:
Increase timeout in configuration:
"env": {
"OOREP_MCP_TIMEOUT_MS": "60000"
}
Check network connectivity to https://www.oorep.com:
curl https://www.oorep.com
Check for firewall/proxy issues that might block connections
Problem: Searches return empty results or "No results found".
Solutions:
minWeight or specific repertory restrictionsProblem: MCP server consuming excessive memory.
Solutions:
Reduce cache TTL to clear cache more frequently:
"env": {
"OOREP_MCP_CACHE_TTL_MS": "60000"
}
Reduce max results:
"env": {
"OOREP_MCP_MAX_RESULTS": "50"
}
Restart Claude Desktop periodically to clear cache
Problem: "Permission denied" when running the server.
Solutions:
For global install: Ensure proper npm permissions
sudo npm install -g oorep-mcp
For npx (recommended): No permissions needed, use -y flag:
npx -y oorep-mcp
To see detailed debug logs for troubleshooting:
Set log level to debug:
"env": {
"OOREP_MCP_LOG_LEVEL": "debug"
}
Check MCP logs:
tail -f ~/Library/Logs/Claude/mcp*.log%APPDATA%\Claude\Logs\Look for specific error patterns:
NetworkError - Connection issuesTimeoutError - Request taking too longValidationError - Invalid inputRateLimitError - Too many requestsnode --version)git clone https://github.com/Dhi13man/oorep-mcp.git
cd oorep-mcp
npm ci
npm run build # Compile TypeScript
npm run typecheck # Type checking only
npm run dev # Development mode with watch
npm test # Run all tests
npm run test:watch # Watch mode
npm run test:coverage # Coverage report
npm run test:e2e # Live OOREP integration (requires network access)
npm run lint # ESLint
npm run format # Prettier
src/
├── **/*.unit.test.ts # Unit tests (mocked dependencies)
└── **/*.integration.test.ts # Integration tests (real implementations)
This tool is for educational and informational purposes only.
Homeopathic treatment should only be undertaken under the guidance of qualified professionals.
MIT License - see LICENSE file for details.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y oorep-mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-dhi13man-oorep-mcp": {
"command": "npx",
"args": [
"-y",
"oorep-mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceoorep-mcpnpmio.github.Dhi13man/oorep-mcp works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.