NoahAI drug pipeline

v1.0.4

Search a pharmaceutical drug database for pipeline and development information. Use this skill whenever the user asks about drugs by name, target, indication...

1· 75·0 current·0 all-time
byyichen@bombert
MIT-0
Download zip
LicenseMIT-0 · Free to use, modify, and redistribute. No attribution required.
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
The skill's name/description match the provided script and instructions: it issues POST queries to a NoahAPI drug-search endpoint and requires NOAH_API_TOKEN and python3. Minor issues: the package dependency 'requests' is required by scripts/search.py but is not declared in the SKILL.md metadata; the skill source/homepage are unknown which reduces transparency but do not contradict the stated purpose.
Instruction Scope
SKILL.md instructs the agent to parse user queries and run scripts/search.py (or pass params file). The script only reads NOAH_API_TOKEN from the environment, sends a POST to https://www.noah.bio/api/skills/drug_search/, and returns results. There are no instructions to read unrelated files or exfiltrate data to unexpected endpoints.
Install Mechanism
There is no install spec and included code is a small Python script. No remote downloads or archive extraction are performed. The only runtime dependency is the third-party 'requests' library (imported by the script), which the skill hints should be pip-installed if missing.
Credentials
Only one environment variable is required (NOAH_API_TOKEN) and it is used directly for Authorization to the described API. The requested credential is proportionate to the stated API access purpose.
Persistence & Privilege
The skill does not request always:true, does not modify other skills or agent-wide settings, and does not persist credentials or install daemons. It runs on-demand and has normal autonomous invocation settings.
Assessment
This skill is internally consistent for querying a NoahAPI drug database, but before installing: 1) Verify the NOAH_API_TOKEN is from a trusted source and scoped appropriately (avoid using broad/production tokens if unsure). 2) Confirm you trust the endpoint https://www.noah.bio and review the organization's privacy/usage policies. 3) Ensure the runtime has the Python 'requests' package available (the script will exit if missing). 4) Be aware the script prints the full query payload to stderr (this may be written to logs), so avoid running it with tokens or queries you consider highly sensitive unless you control the execution environment. 5) If you need higher assurance, request the upstream source/repository or provenance for the skill code and verify it matches the distributed files.

Like a lobster shell, security has layers — review code before you run it.

latestvk97dz9h1zcejr3cg1bnba4hafs842rtw

License

MIT-0
Free to use, modify, and redistribute. No attribution required.

Runtime requirements

🔍︎ Clawdis
Binspython3
EnvNOAH_API_TOKEN
Primary envNOAH_API_TOKEN

SKILL.md

Drug Pipeline Search Skill

This skill converts natural language questions into structured API queries against a pharmaceutical drug database, then presents the results in a readable format.

Workflow

  1. Parse user intent — Extract key entities from the user's question
  2. Build query parameters — Map entities to the query schema below
  3. Execute the query — Run scripts/search.py
  4. Present results — Format and display drug records to the user

Step 1: Extract Keywords

Identify the following entity types from the user's question:

FieldTypeDescriptionExample
drug_namedictDrug name(s){"logic": "or", "data": ["pembrolizumab"]}
companyList[str]Sponsor / developer company["Pfizer", "Roche"]
indicationList[str]Disease / indication["lung cancer", "NSCLC"]
targetdictBiological target(s){"logic": "or", "data": ["PD-1", "VEGF"]}
drug_modalitydictDrug modality / type{"logic": "or", "data": ["antibody", "small molecule"]}
drug_featuredictDrug feature(s){"logic": "or", "data": ["bispecific"]}
phaseList[str]Development phase(s)["Preclinical", "I", "II", "III", "IV", "Others", "IND", "Suspended", "Approved", "Unknow", "Withdraw from Market", "BLA/NDA"]
locationList[str]Geographic location(s)["China", "United States", "Japan"]
route_of_administrationdictRoute of administration{"logic": "or", "data": ["IV", "oral"]}
page_numintPage index (0-based)0
page_sizeintResults per page (1–2000)200

Dict field format:

{"logic": "or", "data": ["value1", "value2"]}
  • logic controls how multiple values are combined: "or" (any match) or "and" (all must match). Default to "or" unless the user explicitly wants all terms to apply simultaneously.
  • data is the list of keyword strings to match.

Type rules:

  • company, indication, phase, location → plain List[str]
  • drug_name, target, drug_modality, drug_feature, route_of_administrationdict with logic and data
  • Default to page_num: 0, page_size: 10 unless the user specifies otherwise
  • Prefer English keywords (the database is indexed in English); translate non-English terms

Step 2: Execute the Query

python scripts/search.py --params '<JSON string>'

Or using a parameter file:

python scripts/search.py --params-file /tmp/query.json

Add --raw to receive the unformatted JSON response.

Step 3: Interpret Results

The response contains:

  • page_num / page_size — current pagination state
  • results — current page of drug records, each with name, phase, modality, targets, companies, indication, development progress, etc.

Step 4: Review and Fallback Search Strategies

If no results are returned, apply the fallback strategies below before giving up. When an initial query returns zero or poor results, try these strategies in order:

Strategy 1 — Drug Name Variant Expansion

Drug names in the database may use different formats (with/without hyphens, partial codes, aliases). Expand the drug_name field to include common variants and merge deduplicated results.

{
  "drug_name": {"logic": "or", "data": ["SHR-A1904", "SHR A1904", "A1904", "SHR1904"]},
  "page_num": 0,
  "page_size": 50
}

Common variant patterns to try:

  • Remove or replace hyphens: SHR-A1904SHR A1904, SHRA1904
  • Strip prefix/suffix: 9MW-2821MW-2821, 9MW2821
  • Known alias: include trade names or INN alongside internal codes

Strategy 2 — Company-First with Application-Layer Filtering

When drug name matching is unreliable, use the company as the anchor. Fetch a broad set of the company's drugs, then filter by modality/indication/target in post-processing.

{
  "company": ["Roche", "Roche Inc"],
  "page_num": 0,
  "page_size": 500
}

After retrieving results, apply local filters:

  • modality == "Antibody-Drug Conjugates, ADCs"
  • indication contains "breast cancer"
  • drug_name matches known code pattern

Use this strategy when the drug code is ambiguous or the API match rate is low.


Strategy 3 — Broad Target/Modality Search with Post-Filtering

When neither name nor company is reliable, search by biological target and modality, then narrow results client-side.

{
  "target": {"logic": "or", "data": ["CLDN18.2", "Nectin-4", "HER2"]},
  "drug_modality": {"logic": "or", "data": ["Antibody-Drug Conjugates, ADCs"]},
  "page_num": 0,
  "page_size": 200
}

After retrieval, filter by company name or drug code pattern using substring matching (e.g. code starts with SHR, 9MW, A166).

Note: If the API supports regex, patterns like (SHR|9MW|A166) can be passed directly in drug_name.data to broaden matching in a single call.


Decision Tree

Initial query returns results?
├── Yes → present results
└── No  → Strategy 1: expand drug_name variants
          └── Still no results → Strategy 2: company anchor + local filter
                                 └── Still no results → Strategy 3: target/modality broad search
Any step hits HTTP 429?
└── Pause entire chain 30s → resume from current strategy
    (sleep ≥5s between every request to avoid triggering 429)

Conversion Examples

User: "Find PD-1 antibodies in Phase 3"

{
  "target": {"logic": "or", "data": ["PD-1"]},
  "drug_modality": {"logic": "or", "data": ["antibody"]},
  "phase": ["III"],
  "page_num": 0,
  "page_size": 30
}

User: "Roche bispecific antibodies for lung cancer"

{
  "company": ["Roche"],
  "drug_feature": {"logic": "or", "data": ["bispecific"]},
  "indication": ["lung cancer"],
  "page_num": 0,
  "page_size": 30
}

User: "Oral small molecule KRAS G12C inhibitors"

{
  "target": {"logic": "or", "data": ["KRAS G12C"]},
  "drug_modality": {"logic": "or", "data": ["small molecule"]},
  "route_of_administration": {"logic": "or", "data": ["oral"]},
  "page_num": 0,
  "page_size": 30
}

User: "Drugs targeting both PD-1 and VEGF"

{
  "target": {"logic": "and", "data": ["PD-1", "VEGF"]},
  "page_num": 0,
  "page_size": 30
}

User: "Look up pembrolizumab"

{
  "drug_name": {"logic": "or", "data": ["pembrolizumab"]},
  "page_num": 0,
  "page_size": 30
}

Dependencies

  • Python 3.8+
  • requests library (pip install requests)
  • Environment variable NOAH_API_TOKEN — API authentication token (required)
    • Register for a free account at noah.bio to obtain your API key.

Security & Packaging Notes

  • This skill only calls NoahAI official HTTPS endpoints under https://www.noahai.bio/api/ and does not contact third-party services.
  • It requires exactly one environment variable: NOAH_API_TOKEN. Store it in the environment or a local .env file, and never place it inline in commands, chats, or packaged files.
  • The token is scoped to read medical public details only and cannot access private user records.
  • The skill does not intentionally persist request parameters locally. Any server-side retention is determined by the NoahAI API service and its operational logging policies.
  • It does not request persistent or system-level privileges and does not modify system configuration.
  • The skill is source-file based (Python scripts only) and does not require runtime installs, package downloads, or external bootstrap steps.

Files

2 total
Select a file
Select a file to preview.

Comments

Loading comments…