MCP server and TypeScript SDK for OOREP homeopathic repertory and materia medica reference data.
Runs on your machine from its package; the steps are below.
At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
npx -y oorep-mcp
MCP client config
{
"mcpServers": {
"oorep": {
"command": "npx",
"args": [
"-y",
"oorep-mcp"
]
}
}
}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.