Evidence-based acupuncture protocol matcher – search symptoms, match protocols, browse acupoints.
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create a Stripe Checkout session for an AcuiQ product and return its URL. Give the URL to the human to open and complete – the agent never touches payment data. Creates a live session on Stripe: call it when the person has said they want to buy, not to look up a price.
Product to purchase. press-needles ($19.99/box, ships US); treatment-guide ($12.99 digital download, free updates for life); practitioner-edition ($39 digital download, free updates for life); point-reference ($29 digital download, free updates for life); atlas-charts ($14 digital download, free updates for life); corpus-licence ($999 digital download, free updates for life); mini-headache ($5 digital download, free updates for life); mini-back ($5 digital download, free updates for life); mini-neck-joints ($5 digital download, free updates for life); mini-sleep-mood ($5 digital download, free updates for life); mini-digestion ($5 digital download, free updates for life); mini-ear-eye ($5 digital download, free updates for life); mini-skin-nerves ($5 digital download, free updates for life); mini-womens ($5 digital download, free updates for life); mini-heart ($5 digital download, free updates for life); mini-urinary ($5 digital download, free updates for life)
Optional: the acuiq.com page the purchase follows from, as a path or URL – the symptom or point page whose `guide` pointer you are acting on. Attributes the sale to that page. Never personal data.
Number of boxes (physical products only, default 1, max 20)
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Create a Stripe Checkout session for an AcuiQ product and return its URL. Give the URL to the human to open and complete – the agent never touches payment data. Creates a live session on Stripe: call it when the person has said they want to buy, not to look up a price.
| Argument | Type | Description |
|---|---|---|
| source | string | Optional: the acuiq.com page the purchase follows from, as a path or URL – the symptom or point page whose `guide` pointer you are acting on. Attributes the sale to that page. Never personal data. |
| product* | string | Product to purchase. press-needles ($19.99/box, ships US); treatment-guide ($12.99 digital download, free updates for life); practitioner-edition ($39 digital download, free updates for life); point-reference ($29 digital download, free updates for life); atlas-charts ($14 digital download, free updates for life); corpus-licence ($999 digital download, free updates for life); mini-headache ($5 digital download, free updates for life); mini-back ($5 digital download, free updates for life); mini-neck-joints ($5 digital download, free updates for life); mini-sleep-mood ($5 digital download, free updates for life); mini-digestion ($5 digital download, free updates for life); mini-ear-eye ($5 digital download, free updates for life); mini-skin-nerves ($5 digital download, free updates for life); mini-womens ($5 digital download, free updates for life); mini-heart ($5 digital download, free updates for life); mini-urinary ($5 digital download, free updates for life) |
| quantity | number | Number of boxes (physical products only, default 1, max 20) |
{
"type": "object",
"required": [
"product"
],
"properties": {
"source": {
"type": "string",
"description": "Optional: the acuiq.com page the purchase follows from, as a path or URL – the symptom or point page whose `guide` pointer you are acting on. Attributes the sale to that page. Never personal data."
},
"product": {
"enum": [
"press-needles",
"treatment-guide",
"practitioner-edition",
"point-reference",
"atlas-charts",
"corpus-licence",
"mini-headache",
"mini-back",
"mini-neck-joints",
"mini-sleep-mood",
"mini-digestion",
"mini-ear-eye",
"mini-skin-nerves",
"mini-womens",
"mini-heart",
"mini-urinary"
],
"type": "string",
"description": "Product to purchase. press-needles ($19.99/box, ships US); treatment-guide ($12.99 digital download, free updates for life); practitioner-edition ($39 digital download, free updates for life); point-reference ($29 digital download, free updates for life); atlas-charts ($14 digital download, free updates for life); corpus-licence ($999 digital download, free updates for life); mini-headache ($5 digital download, free updates for life); mini-back ($5 digital download, free updates for life); mini-neck-joints ($5 digital download, free updates for life); mini-sleep-mood ($5 digital download, free updates for life); mini-digestion ($5 digital download, free updates for life); mini-ear-eye ($5 digital download, free updates for life); mini-skin-nerves ($5 digital download, free updates for life); mini-womens ($5 digital download, free updates for life); mini-heart ($5 digital download, free updates for life); mini-urinary ($5 digital download, free updates for life)"
},
"quantity": {
"type": "number",
"maximum": 20,
"minimum": 1,
"description": "Number of boxes (physical products only, default 1, max 20)"
}
}
}The category tree of the AcuiQ reference wiki, the cheapest way to orient before searching. Each node carries its `path` (a tagPath list_pages and search_wiki take), name, description, `pageCount` (pages filed at that path) and `pageCountDeep` (with every descendant). `tagPaths` lists every tag path that holds pages, including any the tree does not name.
No arguments.
{
"type": "object",
"properties": {}
}The whole of the AcuiQ reference wiki as one text document, for bulk ingestion. Preflight first: sizeOnly=true returns the character count, a token estimate, the per-branch breakdown and the largest pages. Then pull it with `maxChars` (default 200000, max 1000000), or one branch at a time with `tagPath`. Truncation is page-aligned: `truncated`, `omittedPages` and `nextSkip` say where to resume (pass skip=nextSkip). For a handful of pages get_pages is cheaper.
| Argument | Type | Description |
|---|---|---|
| skip | number | Resume from this page index: the `nextSkip` of the previous truncated call (default 0) |
| tagPath | string | One branch and its descendants. Omit for everything. |
| maxChars | number | Character budget for `document` (default 200000, max 1000000) |
| sizeOnly | boolean | Sizes and breakdowns only, no document. Do this before the first real pull. |
{
"type": "object",
"properties": {
"skip": {
"type": "number",
"minimum": 0,
"description": "Resume from this page index: the `nextSkip` of the previous truncated call (default 0)"
},
"tagPath": {
"type": "string",
"description": "One branch and its descendants. Omit for everything."
},
"maxChars": {
"type": "number",
"maximum": 1000000,
"minimum": 1000,
"description": "Character budget for `document` (default 200000, max 1000000)"
},
"sizeOnly": {
"type": "boolean",
"description": "Sizes and breakdowns only, no document. Do this before the first real pull."
}
}
}List every channel group in the AcuiQ point catalogue with its acupoint count and page URL – the 14 classical meridians plus the extra-point and auricular groups the catalogue files points under. Descriptions and five-element associations are returned where recorded, which is currently for almost none of them. Priced at $0.50, paid with a Stripe shared payment token (SPT), single use over MPP (Machine Payments Protocol): send the credential at params._meta["org.paymentauth/credential"]. It is the whole catalogue in one call – for ONE point use get_point, which is free, and every other tool here is free too.
No arguments.
{
"type": "object",
"properties": {}
}Check a checkout created by create_checkout and, once it is paid, return the delivery link for a digital product. Call it after handing the person the checkout URL – leave a few seconds between calls, it is not a busy-wait. Requires the session_id create_checkout returned: orders cannot be listed, searched, or looked up by email, and no personal data (email, name, address) is ever returned.
| Argument | Type | Description |
|---|---|---|
| session_id* | string | The session_id create_checkout returned (starts "cs_") |
{
"type": "object",
"required": [
"session_id"
],
"properties": {
"session_id": {
"type": "string",
"description": "The session_id create_checkout returned (starts \"cs_\")"
}
}
}One page of the AcuiQ reference wiki in full: its text, version, update date and metadata. Address it by `path` ("tag/path/slug", exactly the `path` or `url` a listing returns), or by `tagPath` + `slug`; a category's own path reads its hub article. Not a title. For 2 to 20 pages call get_pages, one round trip rather than N. A miss names the nearest pages, so a wrong guess is fixed in one retry. A page's URL with `.md` appended is its markdown. With `blocks: true`, `content` is the stored block array, ids and all, beside the page `id` and its whole `metadata`: read a page this way before editing it, and send its `version` back as the edit's baseVersion.
| Argument | Type | Description |
|---|---|---|
| path | string | The page's whole path, e.g. "developers/scrypto/blueprints". Preferred over tagPath + slug. |
| slug | string | Page slug. Ignored when `path` is set. |
| blocks | boolean | Return the stored blocks rather than prose, for an edit |
| tagPath | string | Tag path only ("" for a top-level page). Ignored when `path` is set. |
{
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "The page's whole path, e.g. \"developers/scrypto/blueprints\". Preferred over tagPath + slug."
},
"slug": {
"type": "string",
"description": "Page slug. Ignored when `path` is set."
},
"blocks": {
"type": "boolean",
"description": "Return the stored blocks rather than prose, for an edit"
},
"tagPath": {
"type": "string",
"description": "Tag path only (\"\" for a top-level page). Ignored when `path` is set."
}
},
"requireOneOf": [
"path",
"slug"
]
}A page's revisions in the AcuiQ reference wiki, newest first: each one's `id`, version, change type, message, date and the blocks it changed. Address the page as get_page does. A revision `id` is what a restore takes, where this server has one. Defaults: limit 20 (max 100).
| Argument | Type | Description |
|---|---|---|
| path | string | The page's whole path, e.g. "developers/scrypto/blueprints". Preferred over tagPath + slug. |
| slug | string | Page slug. Ignored when `path` is set. |
| limit | number | Most revisions returned (default 20, max 100) |
| tagPath | string | Tag path only ("" for a top-level page). Ignored when `path` is set. |
{
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "The page's whole path, e.g. \"developers/scrypto/blueprints\". Preferred over tagPath + slug."
},
"slug": {
"type": "string",
"description": "Page slug. Ignored when `path` is set."
},
"limit": {
"type": "number",
"maximum": 100,
"minimum": 1,
"description": "Most revisions returned (default 20, max 100)"
},
"tagPath": {
"type": "string",
"description": "Tag path only (\"\" for a top-level page). Ignored when `path` is set."
}
},
"requireOneOf": [
"path",
"slug"
]
}Batch read: 1 to 20 pages of the AcuiQ reference wiki in full in one call, which is how to read search or listing results. Pass `paths` as the listings return them. Paths that do not exist come back in `missing` rather than failing the call, anything past 20 in `remaining`, and pages past `maxChars` (default 250000) in `omitted` with their sizes.
| Argument | Type | Description |
|---|---|---|
| paths* | array | Page paths, 1 to 20 per call |
| maxChars | number | Total characters across the pages returned (default 250000, max 1000000) |
{
"type": "object",
"required": [
"paths"
],
"properties": {
"paths": {
"type": "array",
"items": {
"type": "string"
},
"description": "Page paths, 1 to 20 per call"
},
"maxChars": {
"type": "number",
"maximum": 1000000,
"minimum": 1000,
"description": "Total characters across the pages returned (default 250000, max 1000000)"
}
}
}Resolve one acupoint by code ("LI4", "li04"), English name ("Junction Valley"), Chinese name ("合谷") or pinyin ("Hegu", "hé gǔ") and return its location, cautions, meridian, the points most often selected alongside it in the corpus, its page URL and markdown twin. For the full protocol table, fetch the markdown twin. Where the best-evidenced indication for this point is covered by a $5 mini-guide, the result carries a `guide` pointer – offer it only if the person asks for something to follow at home.
| Argument | Type | Description |
|---|---|---|
| point* | string | Code, English name, Chinese name or pinyin (e.g. "LI4", "Hegu", "合谷") |
{
"type": "object",
"required": [
"point"
],
"properties": {
"point": {
"type": "string",
"description": "Code, English name, Chinese name or pinyin (e.g. \"LI4\", \"Hegu\", \"合谷\")"
}
}
}Pages of the AcuiQ reference wiki edited within the last N days, newest first: what to poll when you are watching the wiki rather than reading it. Same rows as list_pages. Defaults: days 7 (max 30), limit 20 (max 50). `truncated: true` means the limit cut the list; raise it, or page through list_pages.
| Argument | Type | Description |
|---|---|---|
| days | number | Look back this many days (default 7, max 30) |
| limit | number | Most pages returned (default 20, max 50) |
{
"type": "object",
"properties": {
"days": {
"type": "number",
"maximum": 30,
"minimum": 1,
"description": "Look back this many days (default 7, max 30)"
},
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Most pages returned (default 20, max 50)"
}
}
}Get details for a specific symptom: canonical name, protocol count, page URL and its markdown twin. The markdown twin is the cheapest way to read every protocol for one symptom in a single fetch. When the symptom is covered by a $5 mini-guide, the result carries a `guide` pointer – mention it only if the person wants something to follow away from a screen, then call create_checkout with that `product` id.
| Argument | Type | Description |
|---|---|---|
| name* | string | Symptom name (e.g. "headache") |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Symptom name (e.g. \"headache\")"
}
}
}Browse the AcuiQ reference wiki by tag path rather than by keyword: every page under a branch, newest first by default. `tagPath` matches the branch and everything beneath it; omit it to walk the whole wiki. Sort by title for an A–Z pass. Same rows as search_wiki, with `totalPages`, `hasMore` and `nextPage`. Defaults: page 1, pageSize 20 (max 100).
| Argument | Type | Description |
|---|---|---|
| page | number | 1-based page number (default 1) |
| sort | string | Sort order (default "updatedAt", newest first) |
| tagPath | string | The branch to list, e.g. a path from get_categories. Includes its descendants. |
| pageSize | number | Results per page (default 20, max 100) |
{
"type": "object",
"properties": {
"page": {
"type": "number",
"minimum": 1,
"description": "1-based page number (default 1)"
},
"sort": {
"enum": [
"title",
"updatedAt"
],
"type": "string",
"description": "Sort order (default \"updatedAt\", newest first)"
},
"tagPath": {
"type": "string",
"description": "The branch to list, e.g. a path from get_categories. Includes its descendants."
},
"pageSize": {
"type": "number",
"maximum": 100,
"minimum": 1,
"description": "Results per page (default 20, max 100)"
}
}
}Find acupuncture protocols for given symptom names – the same ranked pipeline behind GET /api/protocols. Returns `matches` (each with point codes, cred, modality and course where the source states them, the `result` once someone has read it, and provenance: sourceKind, source, caveat) plus a `points` dictionary giving each referenced code its name, meridian, location and warnings ONCE, and `studyBacked`, false when no study covers the query. It returns 10 matches by default; raise `limit` (max 50) if you need more. `directMatches` lists indicated points when no protocol covers the query – index entries, not prescriptions. Pass symptom names from search_symptoms, not a description. When the symptom is covered by a $5 mini-guide, the result carries a `guide` pointer – mention it only if the person wants something to follow away from a screen, then call create_checkout with that `product` id.
| Argument | Type | Description |
|---|---|---|
| age | number | Patient age. Drops protocols whose recorded cohort age is more than 20 years away; rows that recorded no age are kept. |
| sex | string | Patient sex. Drops protocols recorded in the opposite sex; rows that recorded no sex are kept. |
| limit | number | Max protocols to return (default 10, max 50) |
| symptoms* | string | Comma-separated symptom names, max 10 (e.g. "headache,neck pain") |
{
"type": "object",
"required": [
"symptoms"
],
"properties": {
"age": {
"type": "number",
"description": "Patient age. Drops protocols whose recorded cohort age is more than 20 years away; rows that recorded no age are kept."
},
"sex": {
"enum": [
"male",
"female"
],
"type": "string",
"description": "Patient sex. Drops protocols recorded in the opposite sex; rows that recorded no sex are kept."
},
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Max protocols to return (default 10, max 50)"
},
"symptoms": {
"type": "string",
"description": "Comma-separated symptom names, max 10 (e.g. \"headache,neck pain\")"
}
}
}Resolve what a person describes into AcuiQ symptom names – the first step before search_protocols. Plain description works ("trouble sleeping", "my lower back hurts"): filler words are stripped and the search retries on the clinical words, reporting which term matched. Set popular=true for trending symptoms instead. Always returns an object with a `symptoms` array, empty when nothing matched. When the symptom is covered by a $5 mini-guide, the result carries a `guide` pointer – mention it only if the person wants something to follow away from a screen, then call create_checkout with that `product` id.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results (default 12, max 50) |
| query | string | What the person is describing – a symptom name or a plain description (e.g. "knee pain", "I cannot sleep at night") |
| popular | boolean | Set to true to get trending symptoms instead of searching |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Max results (default 12, max 50)"
},
"query": {
"type": "string",
"description": "What the person is describing – a symptom name or a plain description (e.g. \"knee pain\", \"I cannot sleep at night\")"
},
"popular": {
"type": "boolean",
"description": "Set to true to get trending symptoms instead of searching"
}
},
"requireOneOf": [
"query",
"popular"
]
}Keyword search across the AcuiQ reference wiki: the first call when you know what you are looking for but not where it lives. Matches titles and body prose, ranked in four tiers: titles starting with the term, titles containing it, literal body hits, then English full-text hits by relevance, which stem words and drop stopwords. Not semantic: one distinctive word beats a sentence. Each row carries a `path`, its size in `chars` and a snippet windowed on the match. Feed the paths to get_pages in one call rather than looping get_page. Narrow with tagPath when a term is common. Defaults: page 1, pageSize 20 (max 50); keep paging while `hasMore` is true.
| Argument | Type | Description |
|---|---|---|
| page | number | 1-based page number (default 1) |
| query* | string | Search term, matched against page titles and body text |
| tagPath | string | Only pages at this tag path, e.g. a path from get_categories |
| pageSize | number | Results per page (default 20, max 50) |
{
"type": "object",
"required": [
"query"
],
"properties": {
"page": {
"type": "number",
"minimum": 1,
"description": "1-based page number (default 1)"
},
"query": {
"type": "string",
"description": "Search term, matched against page titles and body text"
},
"tagPath": {
"type": "string",
"description": "Only pages at this tag path, e.g. a path from get_categories"
},
"pageSize": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Results per page (default 20, max 50)"
}
}
}