hs-femtech-mcp
README.md

# HORIZON SHIELD Femtech Registry
**A neutral, verifiable registry of femtech (women's health) information sources.**
It does not diagnose, does not claim products work, does not take referral fees, and does not pretend to be a medical authority. It verifies *who* stands behind a source, *under which jurisdiction*, *with what compensation*, and lets anyone re-compute the proof.
[](https://hs-verify-gate.oga-surf-project.workers.dev/check)









Live endpoint: `https://femtech.horizonshield.dev` (also `https://hs-femtech-mcp.oga-surf-project.workers.dev`)
---
## Verified
This server passes the HORIZON SHIELD Verification Gate (`status: verified`): reachable, MCP conformant, agent-card published, compensation disclosed (`paid_by: public`, no referral or listing fees), and deterministic. It holds itself to the same bar it would apply to anyone else. Re-check it yourself, no trust in us required:
```bash
curl -s -X POST "https://hs-verify-gate.oga-surf-project.workers.dev/check" \
-H "content-type: application/json" \
-d '{"endpoint":"https://femtech.horizonshield.dev/"}'
```
## Why this exists
Women's health is a credence-goods market: buyers cannot easily judge quality, and noise, advertising and referral-driven "recommendations" crowd out primary sources. As front LLMs start recommending femtech, the hard problem is not *more* content, it is **trust**: who published this, are they authoritative, do they get paid to say it, and can the claim be re-checked?
This server is the **trust rail, not the oracle**. It never becomes the medical authority. It indexes authoritative sources and makes their provenance, jurisdiction and compensation machine-readable and re-computable.
> The design principle: **do not call "verified" what you cannot verify.** We verify existence, authority tier, jurisdiction, disclosure and re-computability. We do not adjudicate medical truth.
## What it does / does not
**Does**
- Indexes femtech information sources with publisher, authority tier, jurisdiction, evidence URL and machine-readable compensation.
- Verifies each entry deterministically (SHA-256) so a third party can re-compute the proof.
- Returns neutral, source-linked general information, always with a disclaimer.
- Discloses its own compensation (`referral_fee: false`, `listing_fee: false`) and passes its own bar at `/self`.
**Does not** (enforced in code, fail-closed)
- Diagnose (no symptom to condition tool).
- Claim a product is effective, or rank brands.
- Recommend or take referral / listing fees for any source.
- Store personal health data.
- Claim medical authority or make cross-jurisdiction medical judgments.
## The registry model
Each entry is one information source:
```json
{
"entry_id": "acog_pms_en",
"kind": "source",
"publisher": "American College of Obstetricians and Gynecologists (ACOG)",
"authority_tier": "A_public_or_academic",
"jurisdiction": "US",
"lang": "en",
"topic": "pms",
"evidence_url": "https://www.acog.org/",
"compensation": { "paid_by": "none", "referral_fee": false, "listing_fee": false },
"status": "verified",
"verified_at": "2026-08-27T22:46:08.179Z",
"provenance_sha256": "…",
"anchored": false
}
```
**Five conditions to be listed** (self-application plus machine verification, no human gatekeeper):
1. A reachable, real evidence source.
2. A declared authority tier (public / academic, medical institution, commercial media).
3. A declared jurisdiction (so no source is treated as "correct everywhere").
4. Machine-readable compensation disclosure (we do not judge the content, we only remove the option to hide it).
5. Determinism and re-computation (SHA-256 anchored, reproducible by anyone).
A source that fails is not "rejected", it is `pending`. Fix it and re-apply.
## Topics (P1)
`menstruation` · `pms` · `menopause`, with authoritative sources across JP / US / GB
(JSOG, Japan Society for Menopause and Women's Health, MHLW Healthcare Lab, ACOG, NHS, The Menopause Society, Office on Women's Health).
## Quickstart
Self-check (the server declares and proves its own neutrality):
```bash
BASE="https://hs-femtech-mcp.oga-surf-project.workers.dev"
curl -s "$BASE/self" | python3 -m json.tool
```
List the registry (filter by topic / jurisdiction / lang / status):
```bash
curl -s "$BASE/registry?topic=menopause" | python3 -m json.tool
```
MCP over JSON-RPC 2.0:
```bash
curl -s -X POST "$BASE/" -H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
curl -s -X POST "$BASE/" -H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_femtech_topic","arguments":{"topic_id":"pms_basics_en"}}}'
```
Agent discovery: `GET /.well-known/agent-card.json` (A2A) and `GET /llms.txt` (for front LLMs).
## Tools
| tool | read only | purpose |
|------|-----------|---------|
| `register_source` | no | validate a source against the 5 conditions, persist if verified |
| `list_registry` | yes | filter and list entries |
| `get_registry_entry` | yes | one entry with provenance |
| `verify_source` | yes | canonical form + SHA-256, fail-closed |
| `get_femtech_topic` | yes | neutral, source-linked information |
| `explain_product_category` | yes | product *category* explainer, no brand, no efficacy |
| `how_to_verify` | yes | reproduce the hash yourself |
| `get_agent_card` | yes | A2A card with compensation disclosure |
| `check_source` | yes | is this URL or publisher a verified source here: who, authority tier, jurisdiction, disclosure; unverified is not untrustworthy |
## Run locally over stdio
`stdio.js` runs the same `src/worker.js` in-process as a stdio MCP server (one JSON-RPC message per line). Registry crawlers such as Glama use it through the `Dockerfile`. Without the `FEMTECH_KV` binding the server runs in its documented volatile mode: tool names and schemas are the same nine the live endpoint advertises, `register_source` results are not persisted. JSON-RPC notifications (`notifications/initialized` and friends) get no reply, as the spec requires.
```sh
printf '%s\n%s\n%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"you","version":"0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' | node stdio.js
```
## Verifiability
Every entry has a canonical JSON form and a SHA-256 that a third party can re-compute (`how_to_verify`). Verified entries are listed at `/anchor/pending` for Bitcoin / JIDEC anchoring (OpenTimestamps), so untamperedness becomes provable with a timestamp. `verified` means *untampered and re-computable*, never *medically true*.
## Not a medical service
This service provides source verification and general information only. It does not diagnose, treat, or recommend products. For symptoms or treatment decisions, consult a healthcare professional.
## About
Built and operated by **The HORIZ音s株式会社**, part of [HORIZON SHIELD](https://shield.the-horizons-innovation.com/). Same design lineage as the JCCDB open construction-cost dataset and the HORIZON SHIELD verification gate: verifiable, buyer-side, no pay-for-endorsement.
## Endpoints
| method | path | purpose |
|--------|------|---------|
| POST | `/` | MCP JSON-RPC (initialize, tools/list, tools/call) |
| GET | `/health` | liveness |
| GET | `/self` | neutrality declaration and self-check |
| GET | `/registry` | registry index |
| GET | `/anchor/pending` | hashes awaiting Bitcoin / JIDEC anchoring |
| GET | `/llms.txt` | front-LLM guidance |
| GET | `/.well-known/agent-card.json` | A2A agent card |
## License
MIT. See [LICENSE](./LICENSE).
TDQS
A3.7/5.0
Scored across 9 tools
Disambiguation4/5
Tools are mostly distinct, but verify_source and check_source both deal with verification and could be confused. Others are clearly separate.
Naming Consistency4/5
Mostly verb-led snake_case, but how_to_verify breaks the pattern (it's a noun phrase). The rest follow verb_noun or verb_noun_noun consistently.
Tool Count5/5
Nine tools is well within the typical range and appropriate for a registry/verification MCP covering registration, querying, and content explanations.
Completeness4/5
Core read and create functions are covered, but there is no update or delete mechanism for sources. However, this may be intentional for a public registry, making the gap minor.
Maintenance
ActivityMaintained
ResponsivenessNo issues