Skip to main content
Glama
kinginsun

Probot MCP Server

by kinginsun
README.md
# mcp-probot

Unified [MCP](https://modelcontextprotocol.io) (Model Context Protocol) server for **Probot-series** databases. One stdio process exposes all of the following:

| Database | Tools | Backend |
| --- | --- | --- |
| [Probot HDI](https://www.probot.hk) | `probot-hdi`, `probot-search-item`, `probot-hdi-by-id` | Herb-drug / drug-drug interactions |
| [AITEP](https://aitep.probot.hk) | `aitep_pde_report` | Permitted Daily Exposure (PDE) reports |

This package merges `@kinginsun/mcp-probot-hdi` and `@kinginsun/mcp-aitep`. HDI tool names and request payloads stay the same. The AITEP tool is `aitep_pde_report`.

## Installation

```bash
npm install -g @kinginsun/mcp-probot
```

Or run without a global install:

```bash
npx -y @kinginsun/mcp-probot
```

## Configuration

Set the environment variables for the databases you use. Missing credentials only fail the tools that need them; the rest still work.

### Probot HDI — `PROBOT_MCP_TOKEN`

Create a personal API token in the Probot account center. The plaintext value starts with `pb-` and is shown only once.

```bash
export PROBOT_MCP_TOKEN=pb-your_token_here
```

Optional API base (no trailing slash; default `https://www.probot.hk/probot_api/mcp`):

```bash
export PROBOT_HDI_API_BASE=https://www.probot.hk/probot_api/mcp
```

### AITEP PDE — `AITEP_API_KEY`

Obtaining an `AITEP_API_KEY` requires **company certification** and **VIP authorization** on AITEP.

1. Open [https://aitep.probot.hk](https://aitep.probot.hk)
2. [Register](https://aitep.probot.hk/en/login/register) / [sign in](https://aitep.probot.hk/en/login)
3. Apply for or generate an API key, then:

```bash
export AITEP_API_KEY=your_api_key_here
```

Optional URL override (default `https://aitep.probot.hk/api/hkpma/mcp_api_detail`):

```bash
export AITEP_API_BASE=https://aitep.probot.hk/api/hkpma/mcp_api_detail
```

### Cursor / Claude Desktop

```json
{
  "mcpServers": {
    "probot": {
      "command": "npx",
      "args": ["-y", "@kinginsun/mcp-probot"],
      "env": {
        "PROBOT_MCP_TOKEN": "pb-your_token_here",
        "AITEP_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

Local checkout (after `npm install && npm run build`):

```json
{
  "mcpServers": {
    "probot": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-probot/dist/index.js"],
      "env": {
        "PROBOT_MCP_TOKEN": "pb-your_token_here",
        "AITEP_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

## Tools

### `probot-hdi`

Search herb-drug or drug-drug interactions by drug/herb names.

| Parameter | Type   | Required | Description                                                                                   |
| --------- | ------ | -------- | --------------------------------------------------------------------------------------------- |
| `drug1`   | string | Yes      | Drug/herb name, or multiple aliases in one string separated by ASCII `\|`                     |
| `drug2`   | string | No       | Second drug/herb; same pipe-separated alias convention                                        |
| `maxRows` | number | No       | Maximum results to return (default: 10)                                                       |

When only `drug1` is provided, the API returns all known interactions involving that item (up to `maxRows`).

```json
{
  "name": "probot-hdi",
  "arguments": {
    "drug1": "aspirin|阿司匹林|乙酰水杨酸",
    "drug2": "ginkgo biloba"
  }
}
```

### `probot-search-item`

Look up a drug or herb by name and return its `item_id`.

| Parameter | Type   | Required | Description                                           |
| --------- | ------ | -------- | ----------------------------------------------------- |
| `drug`    | string | Yes      | Drug/herb name, or multiple aliases separated by `\|` |

```json
{
  "name": "probot-search-item",
  "arguments": {
    "drug": "aspirin|阿司匹林"
  }
}
```

### `probot-hdi-by-id`

Search interactions by `item_id`(s) from `probot-search-item`.

| Parameter  | Type   | Required | Description                             |
| ---------- | ------ | -------- | --------------------------------------- |
| `item_id1` | string | Yes      | First item_id                           |
| `item_id2` | string | No       | Second item_id                          |
| `maxRows`  | number | No       | Maximum results to return (default: 10) |

```json
{
  "name": "probot-hdi-by-id",
  "arguments": {
    "item_id1": "123",
    "item_id2": "456"
  }
}
```

Typical HDI workflow:

1. **Direct query** — `probot-hdi` with drug names.
2. **Two-step query** — `probot-search-item` to resolve names, then `probot-hdi-by-id`.

### `aitep_pde_report`

Retrieves the PDE (Permitted Daily Exposure) report for an active pharmaceutical ingredient.

| Parameter     | Type   | Required | Description                          |
| ------------- | ------ | -------- | ------------------------------------ |
| `ingredient`  | string | Yes      | Name of the active pharmaceutical ingredient |

```json
{
  "name": "aitep_pde_report",
  "arguments": {
    "ingredient": "Paracetamol"
  }
}
```

## Adding another Probot database

Each backend lives in its own module (`src/hdi.ts`, `src/aitep.ts`). Register a new tool in `src/tools.ts` with `name`, `description`, `inputSchema`, Zod `schema`, and `handler`. The stdio server in `src/index.ts` does not need to change.

## Requirements

- Node.js >= 18.0.0
- `PROBOT_MCP_TOKEN` for HDI tools
- `AITEP_API_KEY` for AITEP tools

## License

MIT