Appearance
Reports
A report is a PDF built from opportunities that are already scored. run_analyses only scores. get_assessment only explains one verdict. Do not call create_report because the user said analyse.
You must be an editor or owner. Both tools need projects:write.
Create a Report
create_report
| Argument | Notes |
|---|---|
project_id | UUID |
preset | Optional lens. Omit for an unscoped report. |
focus | Optional extra sentence. Not a substitute for preset. |
stages | Optional. Narrow to these stages. Omit for every scored stage. |
names | Optional opportunity names. Replaces stage coverage. Do not pass row ids. |
Presets:
| Preset | What It Emphasises |
|---|---|
competitive_landscape | Competitors, positioning, and whitespace |
opportunity_synthesis | A prioritized thesis |
translational_focus | Evidence from genetics and models through to the clinic |
mechanism_focus | Pathways and open scientific questions |
pipeline_overview | Assets, stages, and near-term catalysts |
investment_brief | Thesis, risks, and decision points |
stages: themes, targets, diseases, modalities.
A named lens sets preset and keeps full coverage. Named opportunities go in names. A stage ("targets only") goes in stages. "Full report" or "generate it" with no lens and no subset calls with no preset and no narrower set. Extra words go in focus. Do not ask again when one of those is already named.
Only "write a report", with no lens, stage, names, or full: ask once, then stop. Offer the six presets, plus the full scored set with no preset. Do not call create_report in that turn.
json
{
"started": true,
"id": "a1b2c3d4-e5f6-4789-8abc-def012345678",
"title": "Kinase landscape",
"status": "generating",
"preset": "competitive_landscape",
"coverage": "full",
"opportunity_count": 12
}coverage is full, stages, or named. status is generating. Say the report is generating. Do not invent a link or say the PDF is ready.
If a name is ambiguous or missing, the tool does not start a report:
json
{
"started": false,
"ok": false,
"reason": "names",
"problems": [{ "query": "kinase", "reason": "ambiguous", "names": ["Kinase A", "Kinase B"] }]
}reason on a problem is ambiguous or none. Show names and ask which one. Do not guess. reason: "empty" means nothing scored matched the request.
If the opportunity payload cannot be loaded, the error status is 502.
List Reports
list_reports
| Argument | Notes |
|---|---|
project_id | UUID |
limit | Optional. Default 10, maximum 20. Must be a positive number. |
json
{
"total": 1,
"reports": [
{
"id": "a1b2c3d4-e5f6-4789-8abc-def012345678",
"title": "Kinase landscape",
"status": "generating",
"created_at": "2026-10-13T12:00:00.000Z"
}
]
}This is status, not the PDF. generating means not ready. "Is it done?" or "show my reports" is this tool. total is the full count, before limit.