Docs
Give your agent the trial-site shortlist.
Sitecite is an MCP server. Your agent sends an indication and a phase and gets back the sites that have run comparable trials, every line linked to its ClinicalTrials.gov record. No account, no API key.
MCP server
Endpoint: https://sitecite.grain64.com/mcp (Streamable HTTP, stateless, JSON-RPC 2.0).
Add it to a client that takes remote MCP servers:
{
"mcpServers": {
"sitecite": {
"type": "http",
"url": "https://sitecite.grain64.com/mcp"
}
}
}
Or call it directly. tools/list returns both tools with their full input and output schemas:
curl -s https://sitecite.grain64.com/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
find_trial_sites
Counts are of trials that LIST the site, not patients the site enrolled. Find the clinical trial sites with the most completed comparable trials for an indication and phase. Returns sites in ClinicalTrials.gov trial-count order, each with the NCT numbers of the comparable trials listed there, completion and termination counts, how many competing trials are recruiting there now, and a second-column evidence score. Read-only, registry data only, every line cited. Use when someone asks where a Phase 1-3 trial in a condition has been run before. The result has a link to save and re-run this comparison for a programme.
| Field | Type | Meaning | |
|---|---|---|---|
conditions | required | list of text, 1–5 | Registry condition terms as ClinicalTrials.gov spells them, for example ["psoriasis", "plaque psoriasis"]. Synonyms are OR-ed. |
phases | required | list of phases, 1–3 | Trial phases to compare against, for example ["2", "2/3"]. |
country | optional | text | Optional. Only sites in this country, named as the registry spells it ("Germany", "United States"). |
max_sites | optional | integer 1–25 | How many sites to return, 1 to 25. |
sort | optional | trial_count | score | trial_count is the registry's own count of comparable trials per site (default). score orders by the evidence score instead; both columns are always returned. |
detail | optional | summary | full | summary (default) returns the 3 most recent trials per site as NCT id, status, completion date and whole-trial enrollment (open any at trial_url_template), with trials_total for the rest, so the result stays small enough for a chat context. full adds up to 10 trials per site with title and link, up to 5 competing trials per site, and more merged spellings. |
Example call (the params of a tools/call request):
{
"name": "find_trial_sites",
"arguments": {
"conditions": [
"psoriasis"
],
"phases": [
"2",
"3"
],
"max_sites": 5
}
}
The result arrives as structuredContent and as JSON text. Sample, trimmed to two sites and two of the three trials each, from a stored registry pull dated 2026-11-06; a live call reads the registry on the day:
{
"query": {
"conditions": [
"psoriasis"
],
"phases": [
"2",
"3"
],
"country": null,
"max_sites": 5,
"sort": "trial_count",
"detail": "summary"
},
"as_of": "2026-11-06",
"reading_guide": "trials_listed = comparable completed or terminated trials whose registry record lists the site, not patients the site enrolled. trial_enrollment_total = enrollment of the whole trial, all sites, never the site's own. score = 0-100 (experience 35, completion 25, enrollment pace 25, recency 15), a second column; order is registry trial count unless sort=score. latest_completion = newest completion among the listed trials, can be well before as_of. Cite NCT ids; each opens at trial_url_template.",
"trial_url_template": "https://clinicaltrials.gov/study/{nct_id}",
"sites": [
{
"rank": 1,
"name": "Dermatology Hospital of Southern Medical University",
"city": "Guangzhou",
"country": "China",
"trials_listed": 15,
"completed": 14,
"terminated": 1,
"latest_completion": "2026-08-19",
"score": 98.3,
"trials_total": 15,
"trials": [
{
"nct_id": "NCT07357831",
"status": "COMPLETED",
"completion_date": "2026-08-19",
"trial_enrollment_total": 539
},
{
"nct_id": "NCT07314060",
"status": "TERMINATED",
"completion_date": "2026-07-30",
"trial_enrollment_total": 36
}
],
"merged_names": [
"Southern Medical University Dermatology Hospital",
"Dermatology Hospital, Southern Medical University"
]
},
{
"rank": 2,
"name": "Shanghai Skin Disease Hospital",
"city": "Shanghai",
"country": "China",
"trials_listed": 13,
"completed": 12,
"terminated": 1,
"latest_completion": "2026-08-19",
"score": 98.1,
"trials_total": 13,
"trials": [
{
"nct_id": "NCT07357831",
"status": "COMPLETED",
"completion_date": "2026-08-19",
"trial_enrollment_total": 539
},
{
"nct_id": "NCT07314060",
"status": "TERMINATED",
"completion_date": "2026-07-30",
"trial_enrollment_total": 36
}
],
"merged_names": [
"Shanghai skin disease hospital"
]
}
],
"totals": {
"comparable_trials": 120,
"comparable_trials_in_registry": 120,
"competing_trials": 40,
"sites_found": 2048
},
"notice": "A cited data summary of public ClinicalTrials.gov records, not a recommendation to select or exclude any site. Counts are of trials that list the site, not of patients enrolled.",
"method_url": "https://sitecite.grain64.com/method/",
"open_in_app_url": "https://sitecite.grain64.com/app/new/?indication=psoriasis&phases=2%2C3&from=mcp"
}
crosscheck_site_list
Counts are of trials that LIST the site, not patients the site enrolled. Check a CRO's proposed site list against the registry. For each pasted site name, returns the matching registry site with confidence, its comparable trials with NCT links and its competing load, plus strong registry sites in the same countries that the list does not include. Read-only, no data stored. Use when you hold a CRO or sponsor site list and want it verified. The result has a link to save and re-run this comparison for a programme.
| Field | Type | Meaning | |
|---|---|---|---|
sites | required | list of text, 1–100 | One proposed site per entry, "Name, City, Country" or the name alone. |
conditions | required | list of text, 1–5 | Registry condition terms for the indication, as in find_trial_sites. |
phases | required | list of phases, 1–3 | Trial phases to compare against. |
detail | optional | summary | full | summary (default) returns the 3 most recent trials per matched site, the 3 closest suggestions without trials and 5 missing strong sites with 3 trials each, so the result stays small enough for a chat context. full adds up to 10 trials per site with title and link, trials for suggestions, and up to 15 missing strong sites. |
Example call:
{
"name": "crosscheck_site_list",
"arguments": {
"sites": [
"Dermatology Clinical Research Center of San Antonio, San Antonio, United States",
"Lynderm Research, Markham, Canada",
"Hautarztpraxis Dr. Example, Hamburg, Germany"
],
"conditions": [
"psoriasis"
],
"phases": [
"2"
]
}
}
Sample, trimmed (two matched rows, one unmatched row, one trial list shortened), from the same stored pull. A row that cannot be matched says why instead of guessing:
{
"query": {
"conditions": [
"psoriasis"
],
"phases": [
"2"
],
"detail": "summary"
},
"as_of": "2026-11-06",
"rows": [
{
"input": "Dermatology Clinical Research Center of San Antonio, San Antonio, United States",
"status": "matched",
"confidence": "high",
"how": "Same name",
"site": {
"name": "Dermatology Clinical Research Center of San Antonio",
"city": "San Antonio",
"country": "United States",
"trials_listed": 6,
"completed": 5,
"terminated": 1,
"latest_completion": "2026-06-01",
"score": 91.7,
"trials_total": 6,
"trials": [
{
"nct_id": "NCT06588283",
"status": "COMPLETED",
"completion_date": "2026-06-01",
"trial_enrollment_total": 281
},
{
"nct_id": "NCT06973291",
"status": "COMPLETED",
"completion_date": "2026-04-22",
"trial_enrollment_total": 606
}
],
"merged_names": [
"San Antonio"
]
},
"suggestions": [],
"reason": null,
"listed_twice": false
},
{
"input": "Lynderm Research, Markham, Canada",
"status": "matched",
"confidence": "high",
"how": "Same name",
"site": {
"name": "Lynderm Research Inc.",
"city": "Markham",
"country": "Canada",
"trials_listed": 12,
"completed": 11,
"terminated": 1,
"latest_completion": "2026-10-14",
"score": 92.1,
"trials_total": 12,
"trials": [
{
"nct_id": "NCT05172726",
"status": "COMPLETED",
"completion_date": "2026-10-14",
"trial_enrollment_total": 58
},
{
"nct_id": "NCT06973291",
"status": "COMPLETED",
"completion_date": "2026-04-22",
"trial_enrollment_total": 606
}
],
"merged_names": [
"Lynderm Research Inc. - Probity - PPDS",
"Lynderm Research Inc - Probity - PPDS"
]
},
"suggestions": [],
"reason": null,
"listed_twice": false
},
{
"input": "Hautarztpraxis Dr. Example, Hamburg, Germany",
"status": "unmatched",
"confidence": null,
"how": null,
"site": null,
"suggestions": [
{
"name": "Hautarztpraxis",
"city": "Witten",
"country": "Germany",
"trials_listed": 3,
"completed": 3,
"terminated": 0,
"latest_completion": "2025-03-07",
"score": 77.2,
"trials_total": 3,
"trials": [],
"merged_names": [
"Hautarztpraxis Dr. med. Matthias Hoffmann"
]
}
],
"reason": "No confident match. The closest registry sites are in suggestions.",
"listed_twice": false
}
],
"stats": {
"rows": 5,
"matched": 4,
"unmatched": 1,
"comparable_trials": 120,
"competing_trials": 40,
"registry_sites": 2048
},
"notice": "A cited data summary of public ClinicalTrials.gov records, not a recommendation to select or exclude any site. Counts are of trials that list the site, not of patients enrolled."
}
What the agent can rely on
- Read-only. Both tools read the open ClinicalTrials.gov registry. What you send is not stored. We count calls (tool, day, an anonymous visitor hash, the client name and version your client announces). When a call errors or finds nothing, its condition words (at most 120 characters, no address, no caller id) and an error code are kept for 30 days so missing synonyms can be fixed.
- Strict inputs. An unknown field is rejected with a message naming it, and the tool says what is allowed. A bad value comes back as readable text the agent can fix on its next call.
- Cited. Every trial carries its NCT number and a link to its registry record. The score sits in a second column; the order is the registry's own trial count unless
sortsays otherwise. How the score is built: Method. - Limits. 60 tool calls an hour per client. Each call analyses up to 200 comparable and 300 competing studies from the last 12 years.
find_trial_sitesreturns up to 25 sites,crosscheck_site_listtakes up to 100. The defaultdetail: "summary"keeps a result near 10 KB: three trials per site, each with its NCT number, status, completion date andtrial_enrollment_total. Ask fordetail: "full"for up to 10 comparable trials with titles and links, and the competing studies. - What a count means.
trials_listedcounts completed or terminated comparable trials whose registry record lists the site, not patients the site enrolled.trial_enrollment_totalis the enrollment of the whole trial across all its sites. Every result carries areading_guidesaying so, the score's four parts, and atrial_url_templateto open any NCT id. - Hand-off to the app. Each result carries
open_in_app_url: the same indication and phases, open in the Sitecite app to save the shortlist and cross-check a CRO's list. - A summary, not a pick. Results are a cited data summary of public records. Choosing sites stays with the sponsor and its CRO.
Prefer a screen to an agent? Cross-check your CRO's list in the app.